6

私はDialogFragmentを拡張し、Fragmentから呼び出しています(サポートライブラリを使用しています.android.support.v4.app.Fragmentなど)

フラグメントは、doPositiveClick() メソッドを含む次のインターフェイスを実装します。

public interface CustomFieldsFragmentAlertDialog {
    public abstract void doPositiveClick();
}

ダイアログを表示するには、次のように呼び出します。

CustomFieldsDialogFragment dialog = CustomFieldsDialogFragment.newInstance();
dialog.show(getFragmentManager(), "fragmentDialog");

これが私のDialogFragmentクラスです

public static class CustomFieldsDialogFragment extends DialogFragment{          

        public static CustomFieldsDialogFragment newInstance() {

            CustomFieldsDialogFragment frag = new CustomFieldsDialogFragment();             
            return frag;
        }   


        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {               

            Builder builder = new AlertDialog.Builder(getActivity()); 
            builder.setTitle("Title");                
            builder.setPositiveButton(posButtonText, new DialogInterface.OnClickListener() {                        

                    @Override
                    public void onClick(DialogInterface dialog, int which) {                            
                        ((CustomFieldsFragmentAlertDialog)getTargetFragment()).doPositiveClick();

                    }
                });
            }                

            return builder.create();

        }       
    }

行((CustomFieldsFragmentAlertDialog)getTargetFragment()).doPositiveClick();を実行しようとすると、null ポインター例外でアプリケーションがクラッシュします。

10-05 13:45:23.550: E/AndroidRuntime(29228): java.lang.NullPointerException 10-05 13:45:23.550: E/AndroidRuntime(29228): com.company.app.CustomFieldsFragment$CustomFieldsDialogFragment$1.onClick で(CustomFieldsFragment.java:194)

CustomFieldsFragmentAlertDialog を呼び出すフラグメントに存在する doPositiveClick() メソッドを呼び出すにはどうすればよいですか?

注、Android 開発者サイトには、行((FragmentAlertDialog)getActivity()).doPositiveClick();を使用するhttp://developer.android.com/reference/android/app/DialogFragment.html#AlertDialogの例が示されています。しかし、アクティビティではなくフラグメントから呼び出しています。

ありがとう、

4

2 に答える 2

1

インラインでは((FragmentAlertDialog)getActivity()).doPositiveClick();、アクティビティはインターフェイスを実装しているため、アクティビティをインターフェイス クラスにキャストできます。

あなたの場合、ターゲットフラグメントを Interface にキャストしたいので、ターゲットフラグメントはインターフェースを実装する必要がありますClassCastException。ただし、メソッドがnullオブジェクトを返していないNullPointerExeceptionことを確認してください。getTargetFragment()

于 2012-10-05T04:53:15.290 に答える
0

インターフェイスを呼び出す前にインターフェイスを初期化していることがわかりません。次のようにしてこれを実現できます。

CustomFieldsFragmentAlertDialog mListener;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception.
    try {
        mListener = (CustomFieldsFragmentAlertDialog) getFragmentManager().findFragmentByTag(hostFragmentTag);
    } catch (ClassCastException e) {
        throw new ClassCastException(getFragmentManager()
                .findFragmentByTag(hostFragmentTag).toString()
                + " must implement CustomFieldsFragmentAlertDialog");
    }
}

(ホスト) フラグメントの呼び出しでリスナーを実装することを忘れないでください。そうしないと、例外がスローされます。

クラッシュを避けるために、リスナーを呼び出す前に常に null をチェックすることをお勧めします。コードは次のようになります。

if(mListener != null)
    mListener.doPositiveClick();
于 2014-06-04T09:36:18.933 に答える