android usar - Cajón de navegación: fijado como siempre abierto en tabletas.




3 Answers

Basado en la idea de que los dispositivos más grandes podrían tener diferentes archivos de diseño, he creado el siguiente proyecto.

https://github.com/jiahaoliuliu/ABSherlockSlides

Destacados :

Como el cajón de un dispositivo grande siempre está visible, no es necesario tener un cajón. En su lugar, un LinearLayout con dos elementos con el mismo nombre será suficiente.

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

Como no tenemos el cajón en el archivo de diseño, cuando la aplicación trata de encontrar el elemento en el diseño, devolverá el valor nulo. Por lo tanto, no es necesario tener un booleano adicional para ver qué diseño está utilizando.

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);
}

Aquí está el ejemplo para usarlo como booleano.

@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);
    }
}
navigation drawer

Estoy utilizando el patrón del cajón de navegación de la biblioteca de asistencia: http://developer.android.com/training/implementing-navigation/nav-drawer.html

Intenté configurarlo como siempre abierto en la tableta (como un menú lateral)

¿Es eso posible con la implementación actual, o tenemos que crear un nuevo diseño y una nueva estructura con una vista de lista en lugar de reutilizar el mismo código?




Pruebe setDrawerLockMode() para bloquear el cajón abierto en dispositivos de pantalla grande.

Como señalé en un comentario, no creo que DrawerLayout esté diseñado para su escenario (aunque no es una mala idea, en mi humilde opinión). Utilice un diseño diferente que contenga el mismo ListView y contenido, o quizás descargue y modifique su propia copia de DrawerLayout que, en dispositivos de pantalla grande, desliza el contenido cuando se abre en lugar de superponerlo.




No tiene que ser tan complicado, ya que hay un método limpio y sencillo para lograrlo.



Paso 1

Simplemente cree un archivo de diseño alternativo similar a este para dispositivos de tableta y colóquelo en el directorio de recursos layout-w600dp-land .

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    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/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <!--
    NavigationView and the content is placed in a horizontal LinearLayout
    rather than as the direct children of DrawerLayout.
    This makes the NavigationView always visible.
    -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <android.support.design.widget.NavigationView
            android:id="@+id/nav"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer"/>
        <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

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



Paso 2

Ahora no tenemos que mostrar el botón de alternar del cajón o cerrar el cajón cuando un elemento hace clic en los dispositivos que no son tabletas.

Paso 2.1

Para hacerlo posible, es necesario verificar si el dispositivo es una tableta o no tableta en tiempo de ejecución.

Agregue el siguiente contenido a un nuevo archivo de recursos de valor en el directorio de valores y config_ui.xml nombre config_ui.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="isDrawerFixed">false</bool>
</resources>

Eso fue para dispositivos que no son tabletas. Para dispositivos de tableta, cree otro con el mismo nombre y colóquelo en values-w600dp-land .

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="isDrawerFixed">true</bool>
</resources>

Cree un nuevo campo en la clase de la actividad a la que pertenece el cajón como private boolean isDrawerFixed; e isDrawerFixed = getResources().getBoolean(R.bool.isDrawerFixed); como isDrawerFixed = getResources().getBoolean(R.bool.isDrawerFixed); .

Paso 2.2

¡Todo listo! Ahora podemos verificar si el dispositivo es una tabla o no tableta como if (isDrawerFixed){} .

Habrá algo como esto.

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                    this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
            drawer.addDrawerListener(toggle);
            toggle.syncState();

Para configurar el botón de alternar en la barra de acción. Envuélvalo dentro de un if (!isDrawerFixed) {}

Para cerrar el cajón cuando se hace clic en un elemento, habrá algo como esto.

drawer.closeDrawer(GravityCompat.START);

Envuélvalo en un if (!isDrawerFixed) {} también.





Para referencia, he incluido capturas de pantalla de una aplicación en la que utilicé este método.




Related

android tablet navigation-drawer