web-dev-qa-db-fra.com

Tiroir de navigation - Désactivez le clic sur les éléments derrière le tiroir

Existe-t-il un moyen de s'assurer que le tiroir de navigation reste au-dessus du contenu du fragment?

J'ai créé une petite application de test avec des données factices. 10 fragments avec un bouton numéroté correspondant et une vue textuelle. Le problème vient du fait que les éléments de fragment semblent avoir une priorité plus élevée que le tiroir de navigation.

enter image description here

Comme on le voit dans la capture d'écran, une fois que j'essaie d'ouvrir le "fragment 0", il opte plutôt pour enregistrer le clic sur le bouton derrière le tiroir de navigation. Appuyer sur n'importe quel autre élément de contenu fonctionne correctement, mais cela tant qu'il n'y a pas d'autres éléments interactifs en dessous. Que puis-je faire pour que le tiroir de navigation reste correctement au-dessus du contenu derrière lui?

53
user1240989

Ensemble Android:clickable="true" tag sur la disposition du volet coulissant.

130
Gennadiy Ryabkin

Le problème ne semble pas dû au focus sur les clics,

Visitez https://developer.Android.com/training/implementing-navigation/nav-drawer.html#DrawerLayout

La vue de contenu principale (FrameLayout ci-dessus) doit être le premier enfant dans DrawerLayout car l'ordre XML implique un ordre z et le tiroir doit être au-dessus du contenu.

4
theinlin kyaw

Dans mon tiroir de fragments, j'ai défini TouchListener pour renvoyer True. Ça a marché pour moi

        mFragmentContainerView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });
3
Everson Rafael

Je l'ai résolu d'une manière différente.

Voici mon code pour configurer le tiroir:

/**
 * Setup Navigation Drawer
 */
private void setDrawer() {
    NavigationDrawerFragment mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.fragment_drawer);
    mNavigationDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), mToolbar);
}

la méthode setup se trouve dans mon NavigationDrawerFragment, voici mon code:

/**
 * Users of this fragment must call this method to set up the navigation drawer interactions.
 *
 * @param fragmentId   The Android:id of this fragment in its activity's layout.
 * @param drawerLayout The DrawerLayout containing this fragment's UI.
 * @param toolbar      The Toolbar of the activity.
 */
public void setup(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
    View mFragmentContainerView = (View) getActivity().findViewById(fragmentId).getParent();
    DrawerLayout mDrawerLayout = drawerLayout;

    //noinspection deprecation
    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));

    ActionBarDrawerToggle mActionBarDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, "Drawer opened", "Drawer closed") {
        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            if (!isAdded()) return;

            // Solution:
            // Disable click event on views below Navigation Drawer
            mFragmentContainerView.setClickable(false);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if (!isAdded()) return;

            // Solution:
            // Enable click event on views below Navigation Drawer
            mFragmentContainerView.setClickable(true);
            getActivity().invalidateOptionsMenu();
        }
    };

    // Defer code dependent on restoration of previous instance state.
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mActionBarDrawerToggle.syncState();
        }
    });

    //noinspection deprecation
    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
}

C'est ça

2
blueware