0

プロジェクトで使用しましたが、LayoutInflaterの機能を完全には理解していません。私にとっては、findViewByIdメソッドを呼び出せないときにビューを見つける方法にすぎません。しかし、時々それは私が期待するように動作しません。

私はこの本当にシンプルなレイアウトを持っています(main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:id="@+id/layout">
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, MyActivity"
            android:id="@+id/txt"/>

    <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Change text"
            android:id="@+id/btn"/>
</LinearLayout>


私が欲しいのは非常に単純です-ボタンを押したときにTextView内のテキストを変更するだけです。すべてがこのように正常に動作します

public class MyActivity extends Activity implements View.OnClickListener {

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

        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        TextView txt = (TextView) findViewById(R.id.txt);
        double random = Math.random();
        txt.setText(String.valueOf(random));
    }
}

しかし、 LayoutInflaterを使用した場合の同等の機能を理解したいですか?私はこれを試しましたが、成功せず、TextViewはその値を変更しませんでした

@Override
public void onClick(View view) {
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View main = inflater.inflate(R.layout.main, null);
    TextView txt = (TextView) main.findViewById(R.id.txt);
    double random = Math.random();
    txt.setText(String.valueOf(random));
}

しかし、デバッグすると、各変数に正しい値が入力されていることがわかります。つまり、 txt変数には実際には「HelloWorld、MyActivity」という値のTextViewが含まれており、setTextメソッドの後には乱数が含まれていますが、UIでこの変更を確認できませんでした。これは、プロジェクトでLayoutInflaterで直面した主な問題です。何らかの理由で、膨張したビューを更新できません。なんで?

4

1 に答える 1

3

私にとっては、findViewById メソッドを呼び出せないときにビューを見つける方法にすぎません。

それは正しくありません。はLayoutInflater、提供された xml レイアウト ファイルからビュー階層をインフレート (構築) するために使用されます。2 番目のコード スニペットでは、レイアウト ファイル ( ) からビュー階層を構築し、その膨張したビューから をR.layout.main見つけて、その上にテキストを設定します。TextView問題は、この膨張したビューが の可視 UI に関連付けられていないことActivityです。たとえば、setContentView今度は膨張したビューを再度呼び出すと、変更を確認できます。これにより、あなたのコンテンツがActivity新しく膨らんだものになりますView:

LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View main = inflater.inflate(R.layout.main, null);
TextView txt = (TextView) main.findViewById(R.id.txt);
double random = Math.random();
txt.setText(String.valueOf(random));
setContentView(main);
于 2012-11-25T09:48:38.970 に答える