Где я могу определить свой OnClickListener для закрытия настраиваемого диалогового окна в Android? - PullRequest
4 голосов
/ 07 июля 2011

Я определил следующее пользовательское диалоговое окно:

public class MyDialog extends Dialog {
    public MyDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_dialog);

        getWindow().setLayout(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    }
}

В диалоговом окне используется следующая раскладка, содержащая только кнопку «Отклонить меня»:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" >

        <Button
            android:id="@+id/dismiss_btn"
            android:layout_width="100dip"
            android:layout_height="30dip"
            android:layout_centerHorizontal="true"
            android:text="Dismiss me"
            android:textSize="8dip"
            android:textColor="#ffffff" />
</RelativeLayout>

Моя MainActivityотображает кнопку triggerDialogBtn, которая покажет мой диалог при нажатии.Я также определил метод-обработчик для кнопки dismiss_btn в моем диалоговом окне, который предназначен для закрытия моего диалога при нажатии.

public class MainActivity extends Activity{
    private Button triggerDialogBtn;
    private MyDialog myDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //initialize my dialog
        myDialog = new MyDialog(this);

        //the button which will trigger the dialog to pop up
        Button triggerDialogBtn = (Button)findViewById(R.id.trigger_btn);
        triggerDialogBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                myDialog.show(); //my dialog pop up
            }
        });

        // I would like to dismiss my dialog when the "Dismiss me" button on the dialog is pressed
        /**** BUT I GOT NULL POINTER EXCEPTION HERE ******/

        //This is the "Dismiss me" button defined on dialog layout
        Button dismissMeBtn = (Button)findViewById(R.id.dismiss_btn); 
        dismissMeBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                 myDialog.dismiss(); 
            }
        });
    }
}

Макет main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <!-- The trigger button which will pop up my dialog when pressed -->
    <Button
        android:id="@+id/trigger_btn"
        android:layout_width="80dip"
        android:layout_height="20dip"
        android:text="Trigger dialog" />
</LinearLayout>

проблема в том, что если я определяю обработчик щелчка для dismiss_btn (который находится в моем диалоговом окне) внутри MainActivity, я не могу закрыть диалоговое окно при нажатии dismiss_btn;это всегда выбрасывает NullPointerException.

Итак, где и как я могу определить обработчик для закрытия моего диалога при нажатии кнопки в моем диалоге?

ОБНОВЛЕНО

Я также попытался поместить обработчик dismiss_btn в свой класс пользовательского диалогового окна, как показано ниже:

public class MyDialog extends Dialog {
    public MyDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_dialog);

        Button dismissMeBtn = (Button)findViewById(R.id.dismiss_btn);

        //ERROR: The method setOnClickListener(View.OnClickListener) in the 
        //       type View is not applicable 
        //       for the arguments (new DialogInterface.OnClickListener(){})

        dismissMeBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ???.dismiss(); // What should replace "???"
            }
        });

        getWindow().setLayout(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    }
}

Я получаю указанную ошибку, не знаючем заменить вопросительные знаки на

Ответы [ 2 ]

9 голосов
/ 07 июля 2011

Представление содержимого вашего действия (как установлено в начале onCreate) является макетом "main", и из этого действия вы пытаетесь получить доступ к представлению (dismiss_btn) в другом макете полностью.Попробуйте переместить этот код:

  Button dismissMeBtn = (Button)findViewById(R.id.dismiss_btn); //This is the "Dismiss me" button defined on dialog layout
  dismissMeBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
             /* Changed to reflect access from listener within MyDialog */
             MyDialog.this.dismiss(); 
        }
      });

В диалоговое окно - отредактируйте при необходимости.

2 голосов
/ 07 июля 2011

Вы можете использовать так:

MyDialog.this.dismiss ();

...