Los botones de la barra de herramientas no responden al tacto cuando está abierto un cajón de navegación
Estoy trabajando en una versión de diseño de material de mi aplicación usando las librerías appcompat v7, y he llegado a un problema con el cajón de navegación. Cuando se abre, los botones de la barra de herramientas de diseño de materiales dejan de funcionar – cualquier toque fuera del cajón de navegación sólo cierra el cajón. Un siguiente es un gif de lo que quiero decir
El gif http://images.rymate.co.uk/images/83JXi1X.png
- Cómo establecer el estilo de diseño de material a deshabilitado EditText (android)?
- Barra de acciones
- Cómo utilizar selectores para cambiar iconos con el nuevo TabLayout
- Android TimePickerDialog color del diseño del material
- ¿Cómo puedo utilizar EditText en lugar de TextView y abrir la fechaPicker en un solo clic?
Aquí está el diseño xml que estoy usando para la actividad:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- The main content view --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.Toolbar android:id="@+id/action_toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:elevation="4dp" /> <FrameLayout android:id="@+id/note_list_container" android:layout_marginTop="?attr/actionBarSize" android:layout_width="match_parent" android:layout_height="match_parent" /> <net.rymate.notes.ui.FloatingActionButton android:id="@+id/fabbutton" android:layout_width="72dp" android:layout_height="72dp" android:layout_gravity="bottom|right" android:layout_marginBottom="16dp" android:layout_marginRight="16dp" /> </FrameLayout> <!-- The navigation drawer --> <LinearLayout android:id="@+id/left_drawer" android:layout_width="300dp" android:layout_marginTop="?attr/actionBarSize" android:layout_height="match_parent" android:layout_gravity="start" android:orientation="vertical"> <ListView android:id="@+id/cat_list" android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="?catBackColour" /> </LinearLayout> </android.support.v4.widget.DrawerLayout>
Y aquí está el código onCreate
que inicializa el cajón y la barra de herramientas.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ROBOTO_LIGHT = Typeface.createFromAsset(this.getAssets(), "Roboto-Light.ttf"); ROBOTO_LIGHT_ITALICS = Typeface.createFromAsset(this.getAssets(), "Roboto-LightItalic.ttf"); setContentView(R.layout.activity_notes); if (findViewById(R.id.note_container) != null) { // The detail container view will be present only in the // large-screen layouts (res/values-large and // res/values-sw600dp). If this view is present, then the // activity should be in two-pane mode. mTwoPane = true; // In two-pane mode, list items should be given the // 'activated' state when touched. FragmentManager fm = getSupportFragmentManager(); //list.setActivateOnItemClick(true); } if (!mTwoPane) { final FloatingActionButton mFab = (FloatingActionButton) findViewById(R.id.fabbutton); mFab.init(Color.parseColor("#1e90ff")); mFab.setFabDrawable(getResources().getDrawable(R.drawable.ic_action_new)); mFab.showFab(); mFab.setOnClickListener(this); list = new NotesListFragment(mFab); } else { list = new NotesListFragment(); } Toolbar toolbar = (Toolbar) findViewById(R.id.action_toolbar); setSupportActionBar(toolbar); getSupportFragmentManager().beginTransaction() .replace(R.id.note_list_container, list) .commit(); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); // the layout mDrawerLinear = (LinearLayout) findViewById(R.id.left_drawer); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); mDrawerLayout.setScrimColor(getResources().getColor(android.R.color.transparent)); mDrawerToggle = new ActionBarDrawerToggle( this, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ toolbar, /* toolbar */ R.string.drawer_open, /* "open drawer" description */ R.string.drawer_close /* "close drawer" description */ ) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { getSupportActionBar().setTitle("Rymate Notes"); supportInvalidateOptionsMenu(); } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { getSupportActionBar().setTitle("Categories"); supportInvalidateOptionsMenu(); } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); pref = getSharedPreferences("rymatenotesprefs", MODE_PRIVATE); mDrawerList = (ListView) findViewById(R.id.cat_list); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); mDbHelper = new NotesDbAdapter(this); mDbHelper.open(); if (mDbHelper.fetchAllNotes().getCount() == 0) { IntroFragment fragment = new IntroFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.note_list_container, fragment) .commit(); } getCategories(); // calls a function which populates the listview }
¿Hay alguna manera de arreglar esto?
- ¿Cómo puedo utilizar un icono en lugar de un título en la barra de herramientas de Android?
- Cheesesquare: enterAlways produce un diseño incorrecto
- NullPointerException-: Intenta invocar el método de interfaz "android.view.View android.view.MenuItem.getActionView () 'en una referencia de objeto nulo
- Selector de fecha de Android en un diálogo
- Cómo hacer en la animación del botón de botón Al igual que en la aplicación de Google Android botón Volver?
- Cómo configurar un efecto ripple en textview o imageview en Android?
- ¿Cómo evitar que Snackbar se cierre?
- Android AppCompat ProgressDialog?
Parece que el evento táctil es robado por la sombra del cajón, es decir, DrawerLayout
mantiene la interceptación de los eventos táctiles, porque Toolbar
forma parte de la vista de contenido, a diferencia de la ActionBar
está encima de la vista de decoración.
Posible trabajo alrededor es interceptar el evento táctil:
Si está entre 0 (arriba) y la altura de la Toolbar
(abajo), envíe el evento directamente al objeto de la Toolbar
. De lo contrario, mantenga el comportamiento normal.
¿Es el mismo caso para los clics de conmutación de cajón?
Resulta Nikola Despotoski tenía la idea correcta – el evento táctil fue robado por el DrawerLayout. Sin embargo, en lugar de interceptar el evento táctil, sólo ajusté el diseño de la actividad de la siguiente manera:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <android.support.v7.widget.Toolbar android:id="@+id/action_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:elevation="4dp" android:minHeight="?attr/actionBarSize" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" > <!-- The main content view --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/note_list_container" android:layout_width="match_parent" android:layout_height="match_parent"/> <net.rymate.notes.ui.FloatingActionButton android:id="@+id/fabbutton" android:layout_width="72dp" android:layout_height="72dp" android:layout_gravity="bottom|right" android:layout_marginBottom="16dp" android:layout_marginRight="16dp" /> </FrameLayout> <!-- The navigation drawer --> <LinearLayout android:id="@+id/left_drawer" android:layout_width="300dp" android:layout_height="match_parent" android:layout_gravity="start" android:orientation="vertical"> <ListView android:id="@+id/cat_list" android:layout_width="match_parent" android:layout_height="match_parent" android:background="?catBackColour" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </LinearLayout> </android.support.v4.widget.DrawerLayout> </FrameLayout>
Esto tiene el efecto deseado de permitir que los eventos táctiles se registren en la Toolbar
lugar de la DrawerLayout.
- Adb no se ejecuta en Ubuntu 64 – comando no encontrado
- ¿Cómo puedo obtener el número de línea donde se lanzó la excepción usando Thread.UncaughtExceptionHandler?