Java View.getId和R.id.viewLabel返回不同的值

Java View.getId和R.id.viewLabel返回不同的值,java,android,Java,Android,假设我在我的活动中有这样一个方法,并将其设置为onClick不同按钮的字段转换为xml: public void onButtonPressedFromView(View button) { switch(button.getId()) { case (R.id.button1) : //do something break; case (R.id.button2) : //do something different break

假设我在我的活动中有这样一个方法,并将其设置为
onClick
不同按钮的字段转换为xml:

public void onButtonPressedFromView(View button) {
   switch(button.getId()) {
   case (R.id.button1) :
      //do something
      break;
   case (R.id.button2) :
      //do something different
      break;
   default :
      //default action
      break;
   }
}
结果表明,如果我按button1,使用
button.getId()
获得的id总是比使用
R.id.button1
获得的id大1。这很容易解决,我只是把代码改成

开关(button.getId()-1)


但是我不喜欢它,我想了解这两种获取视图id的方法之间的区别。

您应该将已知按钮与按键进行比较

onCreate(...) {
    ...
   Button myButton1 = (Button)findViewById(R.id.somebutton);
   Button myButton2 =....
}



public void onButtonPressedFromView(View button) {
   switch(button.getId()) {
   case (myButton1.getId()) :
      //do something
      break;
   case (myButton2.getId()) :
      //do something different
      break;
   default :
      //default action
      break;
   }
}

重要的是不要假设myButton==button。例如,如果在ListView中使用按钮,它可能有多个实例,因此只能通过getId()属性进行比较。

进行了一些测试,我得到了相同的Id

    TextView tv= (TextView ) findViewById(R.id.my_textview);

    Log.i("Test.java","ID 1 : " +R.id.my_textview);
    Log.i("Test.java","ID 2 : " +findViewById(R.id.my_textview).getId() );
    Log.i("Test.java","ID 3 : " +tv.getId() );
    tv.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {
            Log.i("Test.java","ID 4 : " +arg0.getId() );

        }
    });
这是我的日志:

07-10 15:10:19.906: I/Test.java(3680): ID 1 : 2131165227
07-10 15:10:19.906: I/Test.java(3680): ID 2 : 2131165227
07-10 15:10:19.906: I/Test.java(3680): ID 3 : 2131165227
07-10 15:10:21.386: I/Test.java(3680): ID 4 : 2131165227

尝试使用onClick并报告您的发现。

我想我也遇到了同样的问题。希望你也是这样,我的经验解决了你的问题

我有这个问题,因为我错误地把id值放在了相对布局中。参见本例,
layout\u alignTop
layout\u toRightOf
的值是错误的。它们不应包含
+
符号。我不知道你是否也这样做了。但这会导致id值混乱

<ImageButton
        android:id="@+id/btn_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/btn_start"
        android:layout_toRightOf="@+id/btn_start"
        android:contentDescription=""
        android:src="@drawable/forward" />

我也有同样的问题。将导入添加到类:

import com.foo.yourapp.R;

它解决了这个问题。我不知道这种行为的原因。

也有同样的问题。将导入添加到类:

import com.foo.yourapp.R;
导入com.foo.yourapp.R; 它解决了这个问题。我不知道这种行为的原因。
导入com.foo.yourapp.R

实现公共void onClick(View v){}方法,而不是onButtonPressedFromView。只需普通按钮,如
等。我省略了xml实现的其余部分,因为它对上下文不重要。或者,我假设您可以使用setTag(object)来标识按钮,而无需特别引用按钮本身。但我不认为这是一个理想的解决方案。如何在java中使用非常量值的用例?它可以工作,但我不想为布局中的每个按钮创建侦听器。我想到的是一个单一的入口点,用于所有可以从按钮调用的方法。有趣的是,腾讯说不要假设myButton==button。但是他通过预定义您使用的相同视图做了完全相同的事情,尽管看起来更好。在我发布的实例中,您可以做出这样的假设。我只是把它贴出来作为警告。如果创建ListView,视图将被重用,并且不能假定myButton==button。我不知道op是如何使用此代码的,因此我认为警告是完全相关的。实例ID是进行比较的安全方法。