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])。これはSTATICオブジェクトではなく、単一のオブジェクトです。アクティビティのインスタンスを1つ取得すると、このビューのインスタンスが1つ取得されます。アクティビティが再作成される場合にのみ再作成されます。

つまり、アクティビティが再作成されるまで、を呼び出すと常に同じオブジェクトがfindViewById取得されるため、一度取得してonCreate()変数を再利用することをお勧めします。

于 2012-09-06T16:02:31.990 に答える
3

txt2txt1指している id とsame Id同じオブジェクトを意味するため、この動作は必ず発生しますTextViewtxt

于 2012-09-06T16:03:20.667 に答える