0

レイアウトのボタンにクリック リスナーを設定しようとしています。クリック リスナーは、findViewById() を直接呼び出した場合にのみトリガーされ、膨張したレイアウトからビューを取得した場合にはトリガーされません。

public class MyActivity extends Activity implements View.OnClickListener {
    private static final String TAG = "MyActivity";

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

        Button button = (Button)findViewById( R.id.mybutton );
        button.setOnClickListener( this );

        LayoutInflater inflater = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        ViewGroup rootLayout = (ViewGroup)inflater.inflate( R.layout.test,
            (ViewGroup)findViewById( R.id.myroot ), false );
        rootLayout.getChildAt( 0 ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick( View v ) {
                Log.d( TAG, "Click from inflated view" );
            }
        } );
    }

    @Override
    public void onClick( View v ) {
        Log.d( TAG, "Click" );
    }
}

これが私のレイアウトです:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myroot" android:orientation="vertical"
    android:layout_width="fill_parent" android:background="#ffffff"
    android:layout_height="fill_parent">
    <Button android:text="Button" android:id="@+id/mybutton"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

どうしてこれなの?膨張したビューからではなく、最初のメソッドからのみクリックイベントを取得します。

4

2 に答える 2

4

ビュー階層にインフレートするものを何も追加しないため、最初のメソッド (「クリック」を LogCat に送信するメソッド) からのみクリック イベントを取得します。onCreate() メソッドの 2 行目はsetContentView(R.layout.test);、ビューをレイアウト ファイルから拡張し、それらをアクティビティのビュー階層に追加します。数行後に手動でインフレーションを行うと、ビュー階層に rootLayout を追加するのを忘れています。これを行わないと、クリックするものが何もないため、他の onClick() メソッドから LogCat に出力がありません。

于 2011-09-12T23:21:39.193 に答える
1

電話する必要があることがわかりましたsetContentView( rootLayout )

于 2011-09-13T22:04:08.917 に答える