ImageButton onClick никогда не срабатывает

#android #xml #onclicklistener

#Android #xml #onclicklistener

Вопрос:

Мой OnClickListener никогда не срабатывает, я пытался создать прослушиватель только для этой кнопки, тогда, как это сейчас реализовано OnClickListener . initToolbarAndDrawerWithReadableName метод вызывается в дочернем классе как this.initToolbarAndDrawerWithReadableName . Что я сделал не так?

Toolbar.xml

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/end"
    android:gravity="center|end"
    android:id="@ id/auth_toolbar"
    android:theme="@style/AppTheme">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <ImageButton
            android:layout_width="35dp"
            android:layout_height="26dp"
            android:id="@ id/drawer_button"
            android:layout_centerVertical="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:background="@drawable/menu_active"
            android:scaleType="fitXY"
            android:clickable="true"/>
    </RelativeLayout>
</android.support.v7.widget.Toolbar>
 

Панель инструментов инициализации

  protected void initToolbarAndDrawerWithReadableName(String title) {

        toolbarTv = (TextView)findViewById(R.id.toolbarTv);
        toolbarTv.setText(title);
        toolbarTv.setOnClickListener(this);

        View child = (View)getLayoutInflater().inflate(R.layout.drawer_header, null);

        nvDrawer = (NavigationView) findViewById(R.id.nvView);
        nvDrawer.addHeaderView(child);

        mToolbar = (Toolbar) findViewById(R.id.auth_toolbar);
        setSupportActionBar(mToolbar);

        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        setupDrawerContent(nvDrawer);

        imageButton = (ImageButton) mToolbar.findViewById(R.id.drawer_button);
        imageButton.setOnClickListener(this);
    }
 

OnClick:

  @Override
    public void onClick(View v) {
        Log.d("click","i am here");
        switch (v.getId()){
            case R.id.drawer_button:{
                mDrawer.openDrawer(GravityCompat.START);
                break;
            }
            case R.id.toolbarTv:{
                mDrawer.openDrawer(GravityCompat.START);
                break;
            }
        }
    }
 

Комментарии:

1. Вы получаете сообщение «я здесь» на вашем лог-коте?

2. Я подозреваю, что вы не вызывали метод super класса в дочернем классе

3. @PeterChaula Я тоже, это было первое, что я проверил. Я вызвал его.

4. Я попробовал ваш код в пустом действии, drawer_button onClick работает так, как ожидалось.

5. @MohanadMohie Я использовал его уже 6 месяцев в проектах to, но в этом конкретном он не работает =).

Ответ №1:

Просматривая ваш XML-файл, у вас есть только define ImageButton, нет TextView для toolbarTv, а также нет метода click, который определен для оператора switch.

Попробуйте

  <TextView
            android:id="@ id/toolbarTv"
            android:layout_width="35dp"
            android:layout_height="26dp"
            android:id="@ id/toolbarTv"
            android:onClick="onClick"
            android:clickable="true"/>
 

Комментарии:

1. Я удалил TextView из xml, потому что stackowerflow говорил мне, что у меня слишком много кода, но в xml есть Tv, и у меня есть переключатель для Iv и Tv.

2. добавили ли вы android: onClick=»onClick» android:clickable =»true» как в ImageButton, так и в TextView?

3. Да, я пытался добавить только одну строку, и оба они вместе.

4. можете ли вы вставить TextView из xml для toolbarTv в комментарии?

5. Вот и все <TextView android:text=»TextView» android:layout_width=»wrap_content» android:layout_height=»wrap_content» android:layout_marginLeft=»20dp» android:layout_margininstart=»20dp» android: id= «@ id/toolbarTv» android:layout_centerVertical=»true» android:layout_toRightOf=»@ id/ drawer_button» android:layout_toEndOf=»@ id / drawer_button» android:textColor=»@android: color / white» />

Ответ №2:

Вместо того, чтобы устанавливать прослушиватель щелчков на ImageButton, добавьте его в parent RelativeLayout, потому что здесь parent перехватывает событие click.

Комментарии:

1. Если я это сделаю, у меня будет интерактивная панель инструментов, но мне нужно только нажать кнопку

Ответ №3:

используйте руководство по ссылке Butter Knife и GitHub Simple,

1) добавьте это в свои зависимости

        compile 'com.jakewharton:butterknife:8.4.0'
       apt 'com.jakewharton:butterknife-compiler:8.4.0'
 

2) добавьте это в свои зависимости в build.gradle

        apply plugin: 'com.android.library'
       apply plugin: 'com.jakewharton.butterknife'
 

прежде чем

        apply plugin: 'android-apt'
 

Добавить

        apply plugin: 'com.android.library'
       apply plugin: 'com.jakewharton.butterknife'
 

3) добавьте это в свою активность

       @BindView(R.id.drawer_button) ImageButton drawer_button;
 

4) затем добавьте

      @OnClick(R.id.drawer_button)
      public void openDrawer() {
       mDrawer.openDrawer(GravityCompat.START);
       }
 

Ответ №4:

Добавьте эту строку cod в свой xml. Он будет вызывать метод onClick, который вы делали при каждом нажатии кнопки

 android:onClick="onClick"
 

попробуйте сделать ваш xml похожим на это

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/end"
    android:gravity="center|end"
    android:id="@ id/auth_toolbar"
    android:theme="@style/AppTheme">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
    <ImageButton
        android:layout_width="35dp"
        android:layout_height="26dp"
        android:id="@ id/drawer_button"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="@drawable/menu_active"
        android:onClick="onClick"
        android:scaleType="fitXY"
        android:clickable="true"/>
</RelativeLayout>
</android.support.v7.widget.Toolbar>
 

убедитесь, что ваш класс onClick включен в действие, но не в какие-либо другие действия. например

 main activity{

create(){}

other(){}

onClick(){}

otherOther(){}

}
 

кроме того, прокомментируйте метод, который объявляет слушателя на данный момент, и посмотрите, работает ли он, он работает для меня

Комментарии:

1. вы добавили его в кнопку изображения?

2. @hankTheCowDog Я не думаю, что это хорошая идея. Вы делаете одно и то же дважды android:onClick="onClick" . Если вы выбираете интерфейс, тогда используйте его. Если вы выберете объявление в xml, тогда придерживайтесь исключительно этого

3. Да, я добавил его в ImageButton

4. Я вижу, что на нем написано android:clickable =»true», но самый простой способ определить, когда нажат вид, и он создан в XML, — это использовать приведенную выше строку кода. При этом onClick в «» является именем метода, который вы хотите вызвать. Просто так получилось, что метод, который он хочет вызвать, называется onClick

5. @PeterChaula Я понимаю это, но я просто пытаюсь это исправить (предпочитаю делать это в коде), xml onClick на самом деле не вариант, я попробовал это, просто чтобы понять, будет ли это работать таким образом.