Почему завышенные представления не реагируют на прослушиватели кликов? - PullRequest
0 голосов
/ 13 сентября 2011

Я пытаюсь установить прослушиватель для кнопки в моем макете. Слушатель щелчков срабатывает только тогда, когда я вызываю 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 ]

4 голосов
/ 13 сентября 2011

Вы получаете событие click только от первого метода (тот, который отправляет «Click» в LogCat), потому что вы не добавляете ничего, что вы надуваете, к иерархии представлений. Вторая строка вашего метода onCreate (), setContentView(R.layout.test);, заботится о том, чтобы накачать ваши представления из файла макета и добавить их в иерархию представлений действия. Когда вы выполняете инфляцию вручную несколькими строками позже, вы забываете добавить rootLayout в иерархию представления. Без этого нечего щелкать и, следовательно, не выводить данные в LogCat из другого метода onClick ().

1 голос
/ 14 сентября 2011

Оказывается, мне нужно позвонить setContentView( rootLayout ).

...