findViewById是否提供了一个唯一的(静态)实例?

时间:2012-09-06 15:51:55

标签: android android-layout

来自findViewById 's document
   Look for a child view with the given id. If this view has the given id, return this view.

但我不知道幕后是什么。
例如,如果我在布局xml中有TextView,就像这样:

   <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只提供静态实例吗?

2 个答案:

答案 0 :(得分:4)

您可以轻松地发现在调试器中获得了完全相同的对象(变量 - &gt;值列 - &gt; Id) 它不是一个STATIC对象,它只是一个对象,当你获得一个活动实例时,你会得到一个这个视图的实例,只有在重新创建活动时才会重新创建视图。

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

答案 1 :(得分:3)

txt2txt1指向same Id表示TextView的同一对象,其ID为txt,因此此行为必然会发生