4

main.xml が添付された単純なアクティビティがあります。main.xml には、カスタム レイアウト (customLinearLayout) と単純な TextView があります。カスタム レイアウトには、単純なボタンを含む独自のレイアウト ファイル (linearlayout.xml) もあります。レイアウトはクラスによって適切にインフレートされます。

linearlayout.xml のボタンは、main.xml にある textView のテキストを変更しますが、その textView にアクセスできません。私は何を間違っていますか?main.xml も膨張できません。

customLinearLayout は次のとおりです。

public class CustomLinearLayout extends LinearLayout {

LayoutInflater mInflater;
View ContainerView;

Button button1;
TextView tv;

public CustomLinearLayout(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    init();
}

public CustomLinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    init();
}

private void init() {
    mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    ContainerView = mInflater.inflate(R.layout.linearlayout, this, true);

    button1 = (Button) ContainerView.findViewById(R.id.button1);

    // trying to get the TextView from main.xml
    tv = (TextView) ContainerView.findViewById(R.id.textview1); // doesn't work

    // these tries doesn't work either
    //tv = (TextView) ContainerView.getRootView().findViewById(R.id.textview);  
    //tv = (TextView) this.getRootView().findViewById(R.id.textview);
    //tv = (TextView) this.findViewById(R.id.textview);

    button1.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(tv != null)
                tv.setText("works");
            else
                Log.d("CustomLinearLayout", "TextView not found");
        }
    });
}
}

レイアウト ファイル (linearlayout.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="press" />

</LinearLayout>

アクティビティ:

public class TestLayoutViewsv2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
}

アクティビティの main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<test.layoutviewsv2.CustomLinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

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

</LinearLayout>
4

2 に答える 2

2

メソッドfindViewByIdはスコープされています - カスタム ビューは、存在しないテキスト フィールドを探しています。でも大丈夫!あなたの意見は、彼ら自身の小さな世界であるべきです。悲しいことに、これに対応するように設計を変更する必要があります (おそらく、アクティビティへのコールバックなど)。

于 2012-04-22T18:31:18.270 に答える
0

inflate メソッドを間違った方法で使用しています。ビューを拡張している場合、レイアウトを膨張させる意味はありません。inflate メソッドは、自分で新しいインスタンスを作成する必要なく、新しいビューを初期化するために使用されます。あなたがしようとしていることはわかりませんが、インクルードを使用してレイアウトの一部を再利用できます。詳細については、これを確認してくださいhttp://developer.android.com/resources/articles/layout-tricks-merge.html

于 2012-04-22T18:30:24.533 に答える