2

DialogFragment にリスナーを設定しようとしていますが、null ポインター例外が引き続き発生します。

これは私の DialogFragment サブクラスです:

public static class TermsFragment extends DialogFragment {
        TextView t;
        private static String terms;

        static TermsFragment newInstance(String termsCond) {
            TermsFragment f = new TermsFragment();
            terms = termsCond;
            return f;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            getDialog().setCanceledOnTouchOutside(true);
            View v = inflater.inflate(R.layout.termsandconditions, container, false);

            getDialog().setTitle("Terms and Conditions");

            t = (TextView) v.findViewById(R.id.termsText);

            t.setText(terms);

            return v;
        }
    }

そして、次のようにメインの SherlockFragment から呼び出しています。

TermsFragment newFragment = TermsFragment.newInstance(terms);
newFragment.show(getFragmentManager(), "dialog");

これは私のダイアログがうまく表示されます。次のようなボタンリスナーを追加しようとすると:

TermsFragment newFragment = TermsFragment.newInstance(terms);
Button cancel = (Button) newFragment.getDialog().findViewById(R.id.btnCancel);
        cancel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.e(TAG, "Clicked");

            }
        });

または、次のような一般的な onCancel リスナー:

newFragment.getDialog().setOnCancelListener(new Dialog.OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                showLoadingView(false);

            }
        });

ダイアログを表示する前に、null ポインター例外でアプリがクラッシュしました。

私は何を間違っていますか?

4

1 に答える 1

1

を使用する代わりに、を使用してpublic View onCreateViewみませんかpublic Dialog onCreateDialog。次に例を示します。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();

    Bundle args = getArguments();
    currentName = args.getString(ARG_CURRENT_NAME);

    builder.setView(inflater.inflate(R.layout.name_dialog, null));
    builder.setTitle("Rename Rapper Program");
    builder.setMessage("Enter a new name for " + currentName + ":"); 
    builder.setPositiveButton("Rename", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            newName = (EditText) getDialog().findViewById(R.id.new_name);
            newProgName = newName.getText().toString();
            mRename.renameProgram(currentName, newProgName);
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dismiss();
        }
    });

    return builder.create();    
}

を引き続き使用し、.show()達成しようとしていることに基づいてこれをモデル化できます。

于 2013-04-24T12:36:33.757 に答える