【问题标题】:Android: Button click eventAndroid:按钮点击事件
【发布时间】:2011-12-30 06:22:44
【问题描述】:

我的 xml 文件中有 2 个带有 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();
}

在关闭 btn 的 xml 中,我也尝试了 CloseBtnClicked,但没有区别,我收到 UnexpectedError 消息并且应用程序关闭。不知何故,事件只是没有以任何方式被激活。此外,在将 onClick 添加到 closebtn 时,该按钮现在显示在屏幕的左上角并且丢失了它的实际位置。

从 Activity 类调用 SettingDialog :

    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 新手。

谢谢

【问题讨论】:

标签: android button click onclick


【解决方案1】:

只需从此代码中替换您的代码

@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;
        }
}

【讨论】:

    【解决方案2】:

    试试这个,希望对你有帮助

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

    【讨论】:

      【解决方案3】:

      按钮名称是 MyButton。它正在工作。

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

      【讨论】:

      • 我需要使用View.OnClickListener 而不是OnClickListener。
      【解决方案4】:

      你应该转而使用我经常做的最简单的方法,如下所示:

      @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;
              }
          }
      };
      

      【讨论】:

      • 这真的很老了,但请永远不要这样做。有人会打你一巴掌......开关不是最佳实践,跟踪它进行调试将是一场噩梦。请为屏幕上的每个按钮声明一个新的 onClickListener
      • 可以按照上述方式完成,但最好为每个按钮使用单独的侦听器。
      【解决方案5】:

      我的问题的解决方案:

      我没有使用 AlertBuilder 和 AlertDialog,而是将对话框称为:

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

      这很好用。所有点击事件仅在 SettingDialog 中处理。在 SettingDialog 中不进行任何更改。只有调用 SettingDialog 的方式在 Activity 中改变。就是这样。

      顺便说一句,在 onClick() 中将 View 与它的名称关联起来:

          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;
      }
      

      也可以完美运行。我只使用这种方式并且效果很好。无需仅检查 Id。

      希望我的解决方案能帮助像我一样陷入困境的其他人。 感谢大家的努力和帮助。

      【讨论】:

        【解决方案6】:
        android:onClick="CloseDialog"
        

        Button 的布局中Dialog 搜索Activity 类中的方法,而不是Dialog 中的方法

        在Activity 中定义您的方法,该方法正在调用Dialog 或 从标记中删除android:onClick="CloseDialog",并在Dialog 类的Java 代码中设置OnClickListener。

        【讨论】:

          【解决方案7】:

          在java类中添加这个方法:

          public void CloseDialog(View v)
          {
          
          }
          

          因为在布局中你设置了 android:onClick="CloseDialog"

          【讨论】:

            【解决方案8】:

            我认为你应该比较视图 id 而不是视图

            if (v == btn_save)
            

            到

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

            【讨论】:

            • +1 并且在开头添加 Log 之前不要说“onClick 代码永远不会执行”以确保!
            • @Sherif,Yashwant Kumar,Kiran Babu,我也在尝试调试并在 onClick(View v) 处添加断点,但光标并不止于此。我也在 OnClick 中添加了 Log.i 行,但这也没有出现在日志中。我尝试了 Yashwant 和 Kiran Babu 的选择,但都没有奏效。我正在从我的 Activity 中调用此对话框 - 这很重要。
            • @Tvd 将您的 onClick 添加到 Activity 并让您的 Activity 实现 OnClickListener。最后 setOnClickListener(yourActivity)。请报告回来
            • @Tvd 传递一个上下文或者我认为你可以使用 getContext()
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-28
            • 2023-04-09
            • 1970-01-01
            相关资源
            最近更新 更多