Android:按钮点击事件

13

在我的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中,我尝试使用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 的新手。

谢谢


这个可以帮助你:http://themasterworld.com/response-on-click-events-in-android-studio/ - IQworld Master
8个回答

19

你应该采用我经常使用的最简单方法,如下:

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

9
这个说法很老,但请千万不要这样做。否则会被扇耳光……使用开关(switches)不是最佳实践,而且要调试追踪起来也很麻烦。请为屏幕上的每个按钮声明一个新的onClickListener。 - Stephen
可以按照提到的方法完成,但更好的编程方式是为每个按钮使用单独的监听器。 - fury.slay

8
我认为应该比较视图 ID 而不是视图。
if (v == btn_save)

为了

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

1
在添加日志之前,请先确保执行了“onClick”代码!不要说“onClick代码从未执行过+1”的话! - Sherif elKhatib
@Sherif、Yashwant Kumar、Kiran Babu,我也在尝试调试并在onClick(View v)处添加了断点,但光标并没有停留在这里。我还在OnClick内添加了Log.i行,但它也没有显示在日志中。我尝试了Yashwant和Kiran Babu的选项,但都没有起作用。我是从我的Activity中调用此对话框-这是否有影响? - Tvd
@Tvd 将你的 onClick 添加到 Activity 中,并使你的 activity 实现 OnClickListener 接口。最后使用 setOnClickListener(yourActivity) 进行设置。请回报结果。 - Sherif elKhatib
@Tvd 传递一个上下文或者你可以使用 getContext()。 - Sherif elKhatib
@Sherif,只是为了尝试,我在对话框中尝试使用匿名OnClickListern,但也没有成功。我在对话框类的构造函数中保存了上下文 mContext。但是我无法传递 mContext:btn_save.setOnClickListener(mContext); 错误的参数错误。我该如何将 Activity 实现的 OnclickLister 设置到对话框中?我的 Activity 已经实现了 public void onClick(View v) 方法。 - Tvd
1
让我们在聊天室继续这个讨论 - Sherif elKhatib

4
android:onClick="CloseDialog"

Dialog布局中,Button的方法是在Activity类中搜索,而不是在Dialog类中。您可以在调用DialogActivity中定义该方法,或者从标签中删除android:onClick="CloseDialog"并在Dialog类中从Java代码设置OnClickListener

3

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

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

我需要使用 View.OnClickListener 而不是 OnClickListener - User

1
我的问题解决方案:
我没有使用AlertBuilder和AlertDialog,而是直接调用了对话框:
    SettingDialog sd = new SettingDialog(this, mySettings);
sd.show();

这样做效果很好。所有的点击事件都只在SettingDialog中处理,不需要对SettingDialog进行任何更改。Activity中只需要修改调用SettingDialog的方式即可。

顺便说一句,在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。

希望我的解决方案能够帮助像我一样卡住的其他人。 感谢大家的努力和帮助之手。


1

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

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

0
在Java类中添加此方法:
public void CloseDialog(View v)
{

}

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


0

试试这个,希望能有所帮助

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

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

            CloseDialog();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接