来自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只提供静态实例吗?
答案 0 :(得分:4)
您可以轻松地发现在调试器中获得了完全相同的对象(变量 - &gt;值列 - &gt; Id) 它不是一个STATIC对象,它只是一个对象,当你获得一个活动实例时,你会得到一个这个视图的实例,只有在重新创建活动时才会重新创建视图。
换句话说,在重新创建活动之前,当您调用findViewById
时,您始终会获得相同的对象,因此更好的做法是在onCreate()
中获取一次并重用变量。
答案 1 :(得分:3)
txt2
,txt1
指向same Id
表示TextView
的同一对象,其ID为txt
,因此此行为必然会发生