Android: событие нажатия кнопки - PullRequest
12 голосов
/ 16 ноября 2011

У меня есть 2 кнопки в моем XML-файле с RelativeLayout. В моем классе я расширил диалог и реализовал 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 для закрытия btn я также попробовал CloseBtnClicked, но без разницы, и я получаю сообщение UnexpectedError, и приложение закрывается. Каким-то образом событие только не активируется никакими способами. А также при добавлении onClick to 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.

Спасибо

Ответы [ 8 ]

20 голосов
/ 03 апреля 2012

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

@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;
        }
    }
};
8 голосов
/ 16 ноября 2011

Я думаю, вы должны сравнить идентификатор представления, а не представления

if (v == btn_save)

с

   if (v.getId() == btn_save.getId())
4 голосов
/ 16 ноября 2011
android:onClick="CloseDialog"

из Button в макете для Dialog ищет метод в Activity классе, а не в Dialog

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

3 голосов
/ 13 декабря 2012

Имя кнопки - это MyButton.it работает.

   MyButton.setOnClickListener(new OnClickListener() 
{
 @Override          
 public void onClick(View v) 
 {              
     mytextView.setText("Messi");           
  }         
});
1 голос
/ 16 ноября 2011

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

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

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

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

Кстати, в 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;
}

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

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

0 голосов
/ 15 ноября 2014

просто замените ваш код С этого кода

@Override
public void onClick(View v) {

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

    return;
}

на

@Override
public void onClick(View v) {

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

            break;
            case R.id.closeBtn_settingDlg:
                CloseDialog();
            break;
        }
}
0 голосов
/ 16 ноября 2011

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

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

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

            CloseDialog();
0 голосов
/ 16 ноября 2011

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

public void CloseDialog(View v)
{

}

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

...