【问题标题】:Accessing program data from within onClick() inner class从 onClick() 内部类访问程序数据
【发布时间】:2011-02-08 02:02:22
【问题描述】:

我正在尝试从按钮的 onClickListener 实现中的 onClick() 方法访问 EditText。这是代码:

transmit.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        //data validation
        ///////////////////////
        boolean valid = true;
        if(((EditText)findViewById(R.id.drv_in)).getText().toString() == "") {
            TX_FAIL_TEXT = "Missing Driver ID!";
            showDialog(DIALOG_FAIL);
            TX_FAIL_TEXT = "Transmission Failed!"; //reset the dialog fail text to default
            valid = false;
        }
        Log.e("smsDRVERR",((EditText)findViewById(R.id.drv_in)).getText().toString());
        //begin transmission
        ///////////////////////
        if(valid) {
            showDialog(DIALOG_TX_PROGRESS);
            Thread t = new Thread(txRunnable);
            t.start();
        } else {
            //do things if needed

        }
    }
});

永远不会调用 Log.e(不会出现在 logcat 中)。并且程序就像条件语句不存在一样执行。如何在 onClick 实现中正确引用布局项?我也尝试了以下行:

Log.e("smsDRVERR",((EditText)smsActivity.this.findViewById(R.id.drv_in)).getText().toString());

在我在 SO 上找到的这个问题中提到了这一点:

Inside OnClickListener I cannot access a lot of things - how to approach?

但这并不能解决问题。我遗漏了一些我需要在这个内部类中引用这些项目的东西,或者我的语法有点混乱。任何帮助表示赞赏。

【问题讨论】:

  • 你的日志语句超出了条件;它应该无条件地记录代码。您的日志记录或您的查看方式有问题。尝试一个简单的 Log.e("a", "b");在方法的最开始;一旦它开始工作,您就可以诊断出还有什么问题。
  • 日志语句不是问题,它适用于不同的数据。这是我在发布之前使用的测试,以确保我可以规避这样的回应......
  • 在你上面“写Log.e没有被调用”。现在你说“日志语句没问题”。请提供准确的信息并尽量减少代码以重现您的问题。
  • 换句话说,如果我将 Log 语句更改为: Log.e("A", "B");如上所述,日志完全按照它应该显示在 logcat 中。但是,使用上面的函数调用,程序的行为就好像从未调用过 Log。没有错误,logcat 中根本不显示日志记录。

标签: java android events onclick


【解决方案1】:

您没有正确比较您的String

if(((EditText)findViewById(R.id.drv_in)).getText().toString() == "") {

正在检查 objects 是否相等,而您想检查 values 是否相等。您应该使用:

if(((EditText)findViewById(R.id.drv_in)).getText().toString().equals("")) {

就个人而言,我会将getText 返回的值分配给String 变量,而不是多次调用getText

String myEditTextValue = (EditText)findViewById(R.id.drv_in)).getText().toString();
...
if ("".equals(myEditTextValue)) {

【讨论】:

    【解决方案2】:

    首先,您的 onClick 方法是否被调用?二、不要用==做字符串比较;使用.equals()。 (相等的字符串不一定是同一个对象,这是== 测试的。)

    【讨论】:

    • 这确实是真正的问题。 Log.e() 调用不起作用的原因是该函数被传递了一个空值。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2013-10-25
    相关资源
    最近更新 更多