Где я должен определить кнопку onclick for в индивидуальном диалоговом окне?

У меня есть диалог, созданный в файле DialogFragment. Это прекрасно работает.

Для моего диалога я использую индивидуальный макет. Он содержит две кнопки.

release_scan_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

        <Button
            android:id="@+id/code"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Scan 1" />

        <Button
            android:id="@+id/storageplace"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Scan 2" />
</LinearLayout>

ScanFragment.java

public class ScanFragment extends DialogFragment {

    public android.app.Dialog onCreateDialog(android.os.Bundle savedInstanceState) {
        AlertDialog dialog = new AlertDialog.Builder(this.getActivity())
            .setView(this.getActivity().getLayoutInflater().inflate(R.layout.release_scan_dialog, null))
            .setTitle(R.string.title_store)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .create();

            dialog.setOnShowListener(new DialogInterface.OnShowListener() {

                @Override
                public void onShow(DialogInterface dialog) {
                    ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
                }
            });

            // This will crush with a NullPointerException
            dialog.findViewById(R.id.code).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {
                    ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
            }
        });

        return dialog;
    }
}

Если я попытаюсь определить onClick для обеих кнопок, произойдет NullPointerException. Какое правильное событие для реализации onClick?

Спасибо за любой ответ.


comment
Вы читали, например, этот вопрос?   -  person xoxol_89    schedule 24.04.2014
comment
Я прочитал это, и этот случай отличается от моего. Я использую DialogFragment, а не Dialog. Я создал свой диалог, как пример со страницы разработчика Android developer.android. com/guide/topics/ui/dialogs.html#CustomLayout   -  person mburm    schedule 24.04.2014


Ответы (1)


Кнопку code можно найти в представлении, увеличенном из макета release_scan_dialog.

public class ScanFragment extends DialogFragment {

    public android.app.Dialog onCreateDialog(android.os.Bundle savedInstanceState) {

        // Inflate the view for the release_scan_dialog layout.
        final View release_scan_view = getActivity().getLayoutInflater().inflate(R.layout.release_scan_dialog, null);

        AlertDialog dialog = new AlertDialog.Builder(this.getActivity())
            .setView(release_scan_view)
            .setTitle(R.string.title_store)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .create();

            dialog.setOnShowListener(new DialogInterface.OnShowListener() {

                @Override
                public void onShow(DialogInterface dialog) {
                    ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
                }
            });

            // Set the OnClickListener for the 'code' button in the release_scan_dialog layout.
            release_scan_view.findViewById(R.id.code).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {
                    ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
            }
        });

        return dialog;
    }
}
person cybersam    schedule 24.04.2014
comment
Я собирался написать то же самое, но, поскольку вы ответили первым, проголосовал за вас. Простая, но распространенная ошибка. - person canova; 24.04.2014