2013-03-17 16 views
5

私のクラスはDialogFragmentに引数を渡す必要がありますが、NullPointerExceptionのonCreateメソッド(ダイアログクラスの)内でアプリケーションがクラッシュします。コードの ダイアログフラグメントクラス部分:DialogFragment引数とnullpointer例外

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"); 
} 

私は、この行でnullポインタがあります。

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"); 
} 

「ファイル」と呼ぶ貼り付ける文字列がnullではない、私はその後、

Log.i("SHOWFILEACTIVITY", file); 

答えて

6

あなたはコンストラクタを介してConfirmDialogを作成していると、それを確認しましたnewInstance()を呼び出すと、別の(適切な)ConfirmDialogが作成されます。ただし、適切なインスタンスを破棄します。

この問題を解決するには、次の

あなたnewInstance()方法は静的である必要があります:それは正しく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()を変更する必要があります。

+0

okありがとうございます。私はnewInstance関数を使ったことは一度もなく、私は間違いを犯しました! しかし、なぜnewInstanceは静的であるべきですか? – giozh

+1

@giozh Dialogの 'new'インスタンスを作成したいので、既に作成された* Dialogのインスタンスに頼るのは悪い設計アプローチです。メソッドを静的に保つと依存関係が削除され、オブジェクト作成が少なくなります。 –

関連する問題