Android: событие нажатия кнопки

У меня есть 2 кнопки в моем XML файле с RelativeLayout. В моем классе я расширил Dialog и выполнил OnClickListener, а также добавил метод OnClick (View v). Но почему-то код onClick никогда не выполняется при нажатии кнопки. Может ли кто-нибудь помочь мне найти проблему с моим кодом:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="vertical"  
android:padding="10px">

    ......
    <Button android:id="@+id/saveBtn_settingDlg" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:layout_below="@+id/editText1"
    android:layout_marginLeft="10px" android:text="Save" />

    <Button android:id="@+id/closeBtn_settingDlg" android:layout_width="wrap_content" android:layout_height="wrap_content" 
      android:text="Close" android:layout_alignBaseline="@+id/saveBtn_setting" 
      android:layout_toRightOf="@+id/saveBtn_setting" android:onClick="CloseDialog"  />

Класс

 public class SettingDialog extends Dialog implements OnClickListener {

private Button btn_save, btn_close;

           // In Constructor
    btn_save = (Button) findViewById(R.id.saveBtn_settingDlg);
    btn_close = (Button) findViewById(R.id.closeBtn_settingDlg);
    btn_save.setOnClickListener(this);
    btn_close.setOnClickListener(this);

@Override
public void onClick(View v) {
    if (v == btn_save) 
        SaveSettings();
    else if (v == btn_close)
        CloseDialog();

    return;
}

private void CloseDialog() {
    disposeAll();
    this.dismiss();
}

public void CloseBtnClicked(View v) {
    CloseDialog();
}

В xml для close btn я попробовал CloseBtnClicked также, но никакой разницы, и я получаю сообщение UnexpectedError и приложение отключается. Так или иначе событие не активируется никоим образом. А также при добавлении onClick к closebtn кнопка теперь отображается в верхнем левом углу экрана и потеряла фактическое местоположение.

Вызов SettingDialog из класса Activity:

    private void OpenSettingDialog() {

    AlertDialog.Builder ad = new AlertDialog.Builder(this);
    ad.setIcon(R.drawable.ic_dialog_small);

    View inflatedView = LayoutInflater.from(this).inflate(R.layout.settings_dialog, null); 
    ad.setView(inflatedView);

    AlertDialog adlg = ad.create();     
    adlg.show();

}

Может кто-нибудь помочь мне узнать причину этой проблемы и как ее решить. Я новичок в Android.

Спасибо

Ответ 1

Решение моей проблемы:

Вместо использования AlertBuilder и AlertDialog я просто вызвал диалог как:

    SettingDialog sd = new SettingDialog(this, mySettings);
sd.show();

И это сработало хорошо. Все события кликов обрабатывались только в SetDialog. В SettingDialog изменений не было. В действии изменяется только способ вызова параметра SettingDialog. Что это.

BTW, In onClick(), сопоставляющий вид с его именем:

    public void onClick(View v) {
    Log.i("APP: ", "Into OnClick of SettingDialog. View = " + v);
    if (v == btn_save) 
        SaveSettings();
    else if (v == btn_close) 
        CloseDialog();

    return;
}

Также отлично работает. Я использую только этот способ, и он работает хорошо. Нет необходимости проверять только идентификатор.

Надеюсь, мое решение поможет другим, которые застряли, как я. Спасибо всем за ваши усилия и помощь.

Ответ 2

Вам следует обратиться к самому простейшему способу, который я всегда делаю, как показано ниже:

@Override
public void onCreate(Bundle savedInstanceState) {
    button1.setOnClickListener(onClickListener);
    button2.setOnClickListener(onClickListener);
    button3.setOnClickListener(onClickListener);
}

private OnClickListener onClickListener = new OnClickListener() {
    @Override
    public void onClick(final View v) {
        switch(v.getId()){
            case R.id.button1:
                 //DO something
            break;
            case R.id.button2:
                 //DO something
            break;
            case R.id.button3:
                 //DO something
            break;
        }
    }
};

Ответ 3

Я думаю, вам следует сравнить идентификатор вида без представлений

if (v == btn_save)

к

   if (v.getId() == btn_save.getId())

Ответ 4

android:onClick="CloseDialog"

of Button в макете для Dialog выполняет поиск метода в классе Activity не в Dialog

определите свой метод в Activity, который вызывает Dialog или удалите android:onClick="CloseDialog" из тега и установите OnClickListener из кода Java в классе Dialog.

Ответ 5

Название кнопки - MyButton.it.

   MyButton.setOnClickListener(new OnClickListener() 
{
 @Override          
 public void onClick(View v) 
 {              
     mytextView.setText("Messi");           
  }         
});

Ответ 6

добавьте этот метод в класс java:

public void CloseDialog(View v)
{

}

потому что в макете вы установили android: onClick = "CloseDialog"

Ответ 7

Попробуйте это, я надеюсь, что это поможет

 if(v.getId()==R.id.saveBtn_settingDlg)
       SaveSettings();

        else if (v.getId()==R.id.closeBtn_settingDlg)

            CloseDialog();

Ответ 8

Просто замените свой код Из этого кода

@Override
public void onClick(View v) {

    if (v == btn_save) 
        SaveSettings();
    else if (v == btn_close)
        CloseDialog();

    return;
}

to

@Override
public void onClick(View v) {

    switch(v.getId()){
            case R.id.saveBtn_settingDlg:
                SaveSettings();

            break;
            case R.id.closeBtn_settingDlg:
                CloseDialog();
            break;
        }
}