web-dev-qa-db-fra.com

toolbar.setNavigationOnClickListener ne fonctionne pas

toolbar.setNavigationOnClickListener cette fonction ne fonctionne pas ne savent pas pourquoi. 

activity_main.xml Mise en page

<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".login.LoginActivity">

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/AppTheme.AppBarOverlay">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        Android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay">

    </Android.support.v7.widget.Toolbar>
</Android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />

conteneur_main.xml

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true">
    <FrameLayout
        Android:id="@+id/frame_container"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <!-- Listview to display slider menu -->
    <ListView
        Android:id="@+id/list_slidermenu"
        Android:layout_width="240dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:background="@color/list_background"
        Android:choiceMode="singleChoice"
        Android:divider="@color/list_divider"
        Android:dividerHeight="1dp"
        Android:listSelector="@drawable/list_selector" />

</Android.support.v4.widget.DrawerLayout>

Classe d'activité Java

import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.content.res.TypedArray;
import Android.os.Bundle;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.widget.Toolbar;
import Android.util.Log;
import Android.view.View;
import Android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // slide menu items
    private String[] navMenuTitles;


    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // enabling action bar app icon and behaving it as toggle button
        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_drawer);
        setSupportActionBar(toolbar);
        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<>();

        // adding nav drawer items to array
        // Home
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));


        // Recycle the typed array
        navMenuIcons.recycle();
        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);


        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                toolbar,
                R.string.app_name,
                R.string.app_name
        ){
            public void onDrawerClosed(View view) {
                //getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                //getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                super.onDrawerSlide(drawerView, slideOffset);
            }
        };
        mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.d("COMECOU", "COMECOU");
            }
        });
        mDrawerLayout.setDrawerListener(mDrawerToggle);


        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }


    }

    /**
     * Displaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new HomeFragment();
                break;
            case 1:
                fragment = new FindPeopleFragment();
                break;
            case 2:
                fragment = new PhotosFragment();
                break;
            case 3:
                fragment = new CommunityFragment();
                break;
            case 4:
                fragment = new PagesFragment();
                break;
            case 5:
                fragment = new WhatsHotFragment();
                break;

            default:
                break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

}

J'ai oublié de dire que si je glisse je peux voir que le menu est juste que les boutons ne se connectent pas et ne sont pas déclenchés.

METTRE À JOUR

S'il vous plaît voir ma réponse si vous voulez savoir comment le résoudre.

11
PedroAGSantos

J'ai trouvé l'erreur que nous ne pouvons pas placer dans la barre d'outils en dehors de DrawerLayout

voici à quoi ça ressemble:

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



    <Android.support.v4.widget.DrawerLayout
        Android:id="@+id/drawer_layout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fitsSystemWindows="true">

        <FrameLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content">
            <!-- Framelayout to display Fragments -->
            <FrameLayout
                Android:id="@+id/frame_container"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent" />

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:background="#2196F3"
                Android:minHeight="?attr/actionBarSize"/>
        </FrameLayout>

        <!-- Listview to display slider menu -->
        <ListView
            Android:id="@+id/list_slidermenu"
            Android:layout_width="240dp"
            Android:layout_height="match_parent"
            Android:layout_gravity="start"
            Android:background="@color/list_background"
            Android:choiceMode="singleChoice"
            Android:divider="@color/list_divider"
            Android:dividerHeight="1dp"
            Android:listSelector="@drawable/list_selector" />

    </Android.support.v4.widget.DrawerLayout>

</FrameLayout>
1
PedroAGSantos

Une autre chose à retenir est que 

appelant

toolbar.setNavigationOnClickListener()

avant  

setSupportActionBar(toolbar);

ne fonctionnera pas.

47
Mohammad Mahtabi

Je vois que vous utilisez la variable ActionBarDrawerToggle et que, par conséquent, setNavigationOnClickListener() est la mauvaise. Le bon est setToolbarNavigationClickListener(). Cela le fera se comporter comme un bouton bascule.

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("TOU AQUI", "TOU AQUI");
    }
});
6
Henry

Vous devriez utiliser le ActionBarDrawerToggle#setToolbarNavigationClickListener dans votre cas.

Depuis le Documentation Android:

Lorsque DrawerToggle est construit avec une barre d'outils, il définit l'écouteur de clics sur l'icône de navigation. Si vous souhaitez écouter les clics sur l'icône de navigation lorsque DrawerToggle est désactivé (setDrawerIndicatorEnabled (boolean), appelez cette méthode avec votre écouteur et DrawerToggle transmettra les événements de clic à cet écouteur lorsque l'indicateur de tiroir est désactivé.
0
charles-kafels

Dans mon cas - ScrollView a géré toutes les touches. J'ai ajouté Android:layout_marginTop="?android:attr/actionBarSize" après Toolbar et cela a fonctionné. J'espère avoir aidé quelqu'un)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/rootView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <include layout="@layout/common_toolbar" />

    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="?android:attr/actionBarSize"
        >

       <RelativeLayout
           Android:layout_width="match_parent"
           Android:layout_height="wrap_content"
        >
    ... ...
0
Andrew Grow