26 votes

Tiroir de navigation Android au-dessus des onglets

J'utilise le nouveau tiroir de navigation disponible dans la bibliothèque de support. Lorsque j'utilise le tiroir avec des onglets, le menu du tiroir s'affiche sous les onglets comme indiqué ci-dessous. Comment puis-je m'assurer que le menu du tiroir s'affiche sur les onglets. (Le menu du tiroir devrait s'afficher comme s'il n'y avait pas d'onglets).

Menu tiroir sans onglets enter image description here

Menu tiroir avec onglets

enter image description here

17voto

David TA Points 164

J'ai rencontré le même problème et la réponse que j'ai obtenue de Roman Nurik (équipe Android) est que le tiroir de navigation ne doit pas être utilisé avec les onglets de la barre d'action.

La discussion peut être trouvée ici : https://plus.google.com/u/1/116515063230772720916/posts/8dWEkFcbTFX

11voto

andinrajesh Points 268

Créez un fragment séparé appelé TabsFragment et ajoutez le fragment à l'intérieur du conteneur de fragment dans votre activité principale.

Les onglets peuvent être ajoutés à l'intérieur du fragment tabs avec le code suivant.

private FragmentTabHost mTabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mTabHost = new FragmentTabHost(getActivity());
    mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.fragment1);

    mTabHost.addTab(mTabHost.newTabSpec("TabA").setIndicator("TabA"),
           TabA.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("TabB").setIndicator("TabB"),
            TabB.class, null);

    return mTabHost;
}

Ici, TabA et TabB sont des fragments séparés pour les onglets. Vous pouvez implémenter votre fonctionnalité des onglets respectifs dans les fragments respectifs. Référence : http://developer.Android.com/reference/Android/support/v4/app/FragmentTabHost.html

4voto

Balaji Points 1071

Je ne suis pas sûr des onglets de la barre d'action, mais vous pouvez utiliser la bande d'onglets Pager en combinaison avec le tiroir de navigation pour obtenir un modèle de navigation similaire à celui de Google Play Music. mon poste

0voto

Štarke Points 1

Vous pouvez masquer manuellement la vue responsable du rendu des onglets :

public static void setActionBarNavigationVisibility(Activity activity, boolean visible) {
    // --- If the Tabs are BELOW ActionBar (narrow screens) --- 
    int actionViewResId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android"); // @see http://stackoverflow.com/questions/20023483/how-to-get-actionbar-view
    View actionBarContainer = activity.findViewById(actionViewResId); // returns instance of com.android.internal.widget.ActionBarContainer (inaccessible)
    try {
        Field mTabContainerField = actionBarContainer.getClass().getDeclaredField("mTabContainer");
        if (mTabContainerField != null) {
            mTabContainerField.setAccessible(true);
            View mmTabContainer = (View) mTabContainerField.get(actionBarContainer);
            if (mmTabContainer != null)
                mmTabContainer.setVisibility(visible ? View.VISIBLE : View.GONE); // use GONE, so the mTabContainer below ActionBar does not take space in layout
        }
    } catch (Exception e) {
        // TODO handle exception
    }
}

Il suffit d'appeler cette méthode depuis votre implémentation de ActionBarDrawerToggle comme ça :

public void onDrawerSlide(View drawerView, float slideOffset) {
        super.onDrawerSlide(drawerView, slideOffset);
        if (slideOffset == 0) { // 0 = drawer is closed             
            setActionBarNavigationVisibility(activity, true); //show Tabs when Drawer is closed             
        }
    }

public void onDrawerStateChanged(int newState) {
        super.onDrawerStateChanged(newState);
        //hides Tabs right after Drawer starts opening
        if (DrawerLayout.STATE_DRAGGING == newState || DrawerLayout.STATE_SETTLING == newState) {
            setActionBarNavigationVisibility(activity, false);
        }
    }

Cette solution fonctionnera parfaitement si vous utilisez ActionBar.Tabs sur un écran étroit (les onglets s'affichent automatiquement AU-DESSOUS de ActionBar). Mais si vous voulez gérer tous les autres scénarios de navigation (NavigationMode : List, CustomNavigationView, ou les onglets s'affichent directement dans la barre d'action), la première méthode doit gérer toutes ces possibilités :

public static void setActionBarNavigationVisibility(Activity activity, boolean visible) {
    try {
        /* 1. --- If the navigation items are showing in ActionBar directly. We have 3 options Spinner, Tabs, and CustomNav ---
         (When Tabs are showing BELOW ActionBar, is handled at the end) */
        int actionViewResId = Resources.getSystem().getIdentifier("action_bar", "id", "android"); // @see http://stackoverflow.com/questions/20023483/how-to-get-actionbar-view
        View actionBarView = activity.findViewById(actionViewResId); // returns instance of com.android.internal.widget.ActionBarView (inaccessible)
        if (actionBarView != null) {
            int visibility = visible ? View.VISIBLE : View.INVISIBLE; // not GONE, so it still takes space in ActionBar layout

            // handle tabs navigation
            Field mTabScrollViewField = actionBarView.getClass().getDeclaredField("mTabScrollView");
            if (mTabScrollViewField != null) {
                mTabScrollViewField.setAccessible(true);
                View mTabScrollView = (View) mTabScrollViewField.get(actionBarView); // instance of com.android.internal.widget.ScrollingTabContainerView (inaccessible)
                if (mTabScrollView != null)
                    mTabScrollView.setVisibility(visibility);
            }

            // handle Spinner navigation
            Field mSpinnerField = actionBarView.getClass().getDeclaredField("mSpinner"); // resp. mListNavLayout
            if (mSpinnerField != null) {
                mSpinnerField.setAccessible(true);
                View mSpinner = (View) mSpinnerField.get(actionBarView); // instance of android.widget.Spinner
                if (mSpinner != null)
                    mSpinner.setVisibility(visibility);
            }

            // handle Custom navigation
            Field mCustomNavViewField = actionBarView.getClass().getDeclaredField("mCustomNavView"); // resp. mListNavLayout
            if (mCustomNavViewField != null) {
                mCustomNavViewField.setAccessible(true);
                View mCustomNavView = (View) mCustomNavViewField.get(actionBarView);
                if (mCustomNavView != null)
                    mCustomNavView.setVisibility(visibility);
            }
        }
        // 2. --- If the Tabs are BELOW ActionBar (narrow screens) ---          
        ViewParent actionBarContainer = actionBarView.getParent(); // parent of ActionBarView is com.android.internal.widget.ActionBarContainer (inaccessible)
        Field mTabContainerField = actionBarContainer.getClass().getDeclaredField("mTabContainer");
        if (mTabContainerField != null) {
            mTabContainerField.setAccessible(true);
            View mmTabContainer = (View) mTabContainerField.get(actionBarContainer);
            if (mmTabContainer != null)
                mmTabContainer.setVisibility(visible ? View.VISIBLE : View.GONE); // now use GONE, so the mTabContainer below Actionbar does not take space in layout
        }

    } catch (Exception ex) {
        // TODO Handle exception...         
    }
}

0voto

kencoder Points 6

La version Android de WordPress a une implémentation du problème que vous avez énoncé.

Ils ont développé une version imitée de TabView appelée "HorizontalTabView". La raison pour laquelle ils ont créé cette version est exactement la même que celle dont vous (et moi) avez besoin.

WordPress github : https://github.com/WordPress/WordPress

Source connexe :

  • HorizontalTabView.java
  • WPActionBarActivity.java
  • res/theme_browser_activity.xml

J'espère que cette astuce vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X