为什么膨胀的视图不响应点击监听器?

时间:2011-09-12 22:00:58

标签: android layout onclick inflate

我正在尝试为布局中的按钮设置单击侦听器。点击监听器仅在我直接调用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>

这是为什么?我只从第一种方法获得点击事件,而不是从膨胀的视图中获得。

2 个答案:

答案 0 :(得分:4)

您只能从第一种方法(将“Click”发送到LogCat)获取click事件,因为您不会向视图层次结构添加任何膨胀的内容。 onCreate()方法的第二行setContentView(R.layout.test);负责从布局文件中扩展视图并将它们添加到活动的视图层次结构中。几行之后手动执行通货膨胀时,您忘记将rootLayout添加到视图层次结构中。如果不执行此操作,则无需单击任何内容,因此LogCat上的其他onClick()方法无法输出。

答案 1 :(得分:1)

原来我需要拨打setContentView( rootLayout )