2013-03-17 232 views
5

我的類應該將一個參數傳遞給DialogFragment,但是我的應用程序在onCreate方法(對話框類)內發生NullPointerException異常。代碼 對話片段類部分:DialogFragment參數和空指針異常

public class ConfirmDialog extends DialogFragment { 

public ConfirmDialog() {} 

ConfirmDialog newInstance(String f) { 
    ConfirmDialog d = new ConfirmDialog(); 

    Bundle args = new Bundle(); 
    args.putString("FILE_NAME", f); 
    d.setArguments(args); 

    return d; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    file = getArguments().getString("FILE_NAME"); 
} 

我在這一行的空指針:

file = getArguments().getString("FILE_NAME"); 

而且我不知道爲什麼。 我也粘貼代碼調用對話框

private void showConfirmDialog(String file) { 
    FragmentManager fm = getSupportFragmentManager(); 
    ConfirmDialog dialog = new ConfirmDialog(); 
    Log.i("SHOWFILEACTIVITY", file); 
    dialog.newInstance(file); 
    dialog.show(fm, "fragment_confirm_dialog"); 
} 

這裏的「文件」的字符串不是空的,我已經與

Log.i("SHOWFILEACTIVITY", file); 

回答

6

你通過構造函數創建一個ConfirmDialog檢查,然後呼叫newInstance(),這產生另一個(適當的)ConfirmDialog。然而,你然後丟棄適當的實例。

要解決這個問題:

newInstance()方法應該是靜態的:

public static ConfirmDialog newInstance(String f) { 
    ConfirmDialog d = new ConfirmDialog(); 

    Bundle args = new Bundle(); 
    args.putString("FILE_NAME", f); 
    d.setArguments(args); 

    return d; 
} 

而且showConfirmDialog()應進行更改,以便它使用newInstance()方法正確。

private void showConfirmDialog(String file) { 
    FragmentManager fm = getSupportFragmentManager(); 
    Log.i("SHOWFILEACTIVITY", file); 

    ConfirmDialog dialog = ConfirmDialog.newInstance(file); 
    dialog.show(fm, "fragment_confirm_dialog"); 
} 
+0

好的謝謝,它的工作原理。我從來沒有使用newInstance函數,我犯了一個錯誤! 但爲什麼newInstance應該是靜態的? – giozh 2013-03-17 17:47:24

+1

@giozh因爲我們想創建一個Dialog的'new'實例,這是一個糟糕的設計方法來依賴已經創建的* Dialog實例。保持靜態方法可以消除依賴關係,並減少對象的創建。 – 2013-03-17 17:51:42