0

findViewById 的文档中
Look for a child view with the given id. If this view has the given id, return this view.

但我不知道幕后是什么。
例如,如果我有一个TextView这样的布局 xml:

   <TextView
    android:id="@+id/txt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

然后我在代码中得到这个 TextView:

TextView txt1;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

     txt1 = (TextView)findViewById(R.id.txt);
     txt1.setText("Some text");
 }

在另一个地方(可能在按钮 onClickListener 中),我再次得到这个 TextView:

((Button) findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

   TextView txt2 = (TextView) findViewById(R.id.txt);
   Log.d(TAG,"txt2: " + txt2.getText().toString());
   Log.d(TAG,"txt1: " + txt1.getText().toString());
   //Change txt2 text
   txt2.setText("aaa");
   Log.d(TAG,"txt2: " + txt2.getText().toString());
   Log.d(TAG,"txt1: " + txt1.getText().toString());
   //change txt1 text
   txt1.setText("bbb");
   Log.d(TAG,"txt2: " + txt2.getText().toString());
   Log.d(TAG,"txt1: " + txt1.getText().toString());
  }
});

结果如下:

txt2: Some text
txt1: Some text
txt2: aaa
txt1: aaa
txt2: bbb
txt1: bbb

你能解释一下吗?findViewById 是否只提供静态实例?

4

2 回答 2

4

你可以很容易地发现你在调试器中得到了完全相同的对象(变量 -> 值列 -> Id)它不是一个静态对象,它只是一个对象,当你得到一个活动实例时,你会得到这个视图的一个实例,查看只有在重新创建活动时才会重新创建。

换句话说,在重新创建活动之前,您在调用时总是会得到相同的对象findViewById,因此更好的做法是一次性获取onCreate()并重用变量。

于 2012-09-06T16:02:31.990 回答
3

txt2,txt1指向表示与idsame Id相同的对象,因此这种行为必然会发生TextViewtxt

于 2012-09-06T16:03:20.667 回答