61 votes

Tiroir de navigation: réglé comme toujours ouvert sur les tablettes

Je suis l'aide de la Navigation Tiroir modèle à partir de la bibliothèque de prise en charge: http://developer.android.com/training/implementing-navigation/nav-drawer.html

J'ai essayé de le définir comme toujours ouvert sur la tablette (comme un menu latéral)

enter image description here

Est-ce une chose possible avec l'implémentation actuelle, ou devons-nous créer une nouvelle maquette et une nouvelle structure avec un Listview au lieu de réutiliser le même code?

47voto

jiahao Points 952

Basé sur l'idée de gros appareils différents fichiers de mise en page, j'ai créé le projet follow.

https://github.com/jiahaoliuliu/ABSherlockSlides

Faits saillants:

Depuis le tiroir d'un grand appareil est toujours visible, il n'y a pas besoin d'avoir un tiroir. Au lieu de cela, un LinearLayout avec deux éléments avec le même nom sera suffisant.

<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="horizontal">
     <ListView
             android:id="@+id/listview_drawer"
             android:layout_width="@dimen/drawer_size"
             android:layout_height="match_parent"
             android:layout_gravity="start"
             android:choiceMode="singleChoice"
             android:divider="@android:color/transparent"
             android:dividerHeight="0dp"
             android:background="@color/drawer_background"/>
    <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="@dimen/drawer_content_padding"
            />
</LinearLayout>

Parce que nous n'avons pas le tiroir dans le fichier de layout, lorsque l'application d'essayer de trouver l'élément dans la mise en page, il retournera null. Donc, il n'y a pas besoin d'avoir un supplément de booléen pour voir la mise en page est à l'aide.

DrawerLayout mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);

if (mDrawerLayout != null) {
    // Set a custom shadow that overlays the main content when the drawer opens
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    // Enable ActionBar app icon to behave as action to toggle nav drawer
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // ActionBarDrawerToggle ties together the proper interactions
    // between the sliding drawer and the action bar app icon
    mDrawerToggle = new ActionBarDrawerToggle(
            this,
            mDrawerLayout,
            R.drawable.ic_drawer,
            R.string.drawer_open,
            R.string.drawer_close) {

        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
        }

        public void onDrawerOpened(View drawerView) {
            // Set the title on the action when drawer open
            getSupportActionBar().setTitle(mDrawerTitle);
            super.onDrawerOpened(drawerView);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

Voici l'exemple de l'utiliser comme un booléen.

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    if (mDrawerLayout != null) {
        mDrawerToggle.syncState();
    }
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (mDrawerLayout != null) {
        // Pass any configuration change to the drawer toggles
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
}

32voto

methodin Points 3994

Bâtiment sur CommonsWare de réponse, vous pouvez le faire avec un couple d'ajustements. Le premier consiste à fixer les trois lignes suivantes:

drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
drawerLayout.setScrimColor(getResources().getColor(R.color.drawerNoShadow));
isDrawerLocked = true;

Le drawerNoShadow couleur peut juste être un no-alpha de la couleur (comme 0x00000000). Que vous obtient un tiroir sans fond de superposition.

La deuxième chose que vous devez faire est d'ajuster la padding_left valeur de votre FrameLayout. Pour ce faire, vous pouvez configurer une dimension de contrôle de la ce (0dp par défaut) - dans cet exemple, R. dimen.drawerContentPadding. Vous aurez aussi besoin d'un R. dimen.drawerSize valeur qui sera la largeur de la DrawerLayout.

Cela vous permet de vérifier la paddingLeft valeur de la FrameLayout à l'appel de ces lignes.

FrameLayout frameLayout = (FrameLayout)findViewById(R.id.content_frame);
if(frameLayout.getPaddingLeft() == (int)getResources().getDimension(R.dimen.drawerSize) {
    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
    drawerLayout.setScrimColor(getResources().getColor(R.color.drawerNoShadow));
    isDrawerLocked = true;
}

Vous pouvez ensuite l'envelopper de toutes les fonctionnalités que vous ne souhaitez pas activer en if(!isDrawerLocked) déclaration. Il s'agira notamment:

  • drawerLayout.setDrawerListener(drawerToggle);
  • getActionBar().setDisplayHomeAsUpEnabled(true);

Enfin, vous avez besoin de l'installation d'autres dispositions pour le point de vue statique d'un tiroir. Un exemple est:

<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">

    <!-- The navigation drawer -->
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="@dimen/drawerSize"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>

</android.support.v4.widget.DrawerLayout>
<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="@dimen/drawerContentPadding"/>

La beauté est ici que vous pouvez ensuite contrôler l'ensemble de la logique par la mise en place suppléant dimen.xml les fichiers pour les appareils que vous souhaitez cibler et la seule chose que vous avez besoin de changer la valeur de drawerContentPadding et de proposer la modification de l'agencement.

NOTE: j'ai utilisé le margin_left au lieu de padding_left puisque dans la nouvelle mise en page, il superpositions le tiroir. Voir plus en profondeur le blog à propos de la technique à http://derekrwoods.com/2013/09/creating-a-static-navigation-drawer-in-android/

14voto

CommonsWare Points 402670

Essayez setDrawerLockMode() pour verrouiller le tiroir ouvert sur les appareils à grand écran.

Comme je l'ai mentionné dans un commentaire, je ne pense pas qu' DrawerLayout est conçu pour votre scénario (même si c'est pas une mauvaise idée, à mon humble avis). Soit utiliser une mise en page différente qui héberge le même ListView et le contenu, ou peut-être télécharger et de modifier votre propre copie de l' DrawerLayout que, sur les appareils à grand écran, le contenu des diapositives de plus, lorsqu'il est ouvert, plutôt que de le chevauche.

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