2014-10-18 9 views
6

Sto lavorando a una versione di progettazione materiale della mia app utilizzando le librerie appcompat v7 e ho riscontrato un problema con il cassetto di navigazione. Quando si apre, i pulsanti nella barra degli strumenti di progettazione del materiale cessano di funzionare: qualsiasi tocco all'esterno del cassetto di navigazione chiude il cassetto. Un seguito è una gif di ciò che intendoI pulsanti della barra degli strumenti non rispondono al tocco quando un cassetto di navigazione è aperto

the gif http://images.rymate.co.uk/images/83JXi1X.png

Qui è il layout xml che sto utilizzando per l'attività:

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

Ed ecco il codice onCreate che inizializza il cassetto e il barra degli strumenti.

@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 

} 

C'è un modo per risolvere il problema?

+1

Le specifiche di progettazione del materiale indicano che il cassetto di navigazione deve trovarsi sopra la barra degli strumenti e sotto la barra di stato, e in tal caso il comportamento del pulsante che non risponde ha perfettamente senso. Dai un'occhiata qui: http://www.google.com/design/spec/patterns/navigation-drawer.html –

risposta

1

Si scopre che Nikola Despotoski ha avuto l'idea giusta: l'evento tattile è stato rubato da DrawerLayout. Tuttavia, invece di intercettare l'evento di tocco ho appena regolato il layout di attività in questo modo:

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

Questo ha l'effetto desiderato di permettere eventi touch da registrare dal Toolbar piuttosto che il DrawerLayout.

+10

così hai scritto una risposta alla tua stessa domanda basandoti su un altro suggerimento e poi hai accettato la tua risposta? e non ha nemmeno revocato o accettato la sua risposta? – VipulKumar

+0

È difficile capire quale modifica del layout ha impedito al cassetto di intercettare l'evento di tocco dalla barra degli strumenti ... – Marek

11

Sembra che evento di tocco di furto dall'ombra del cassetto, cioè DrawerLayout mantiene intercettare gli eventi touch, perché Toolbar è parte della vista contenuto, a differenza del ActionBar essere sulla parte superiore della vista arredamento.

lavoro possibile intorno sta intercettando l'evento di tocco:

se è compreso tra 0 (in alto) e Toolbar altezza (in basso), inviare l'evento direttamente all'oggetto Toolbar. Altrimenti mantieni il comportamento normale.

Lo stesso caso per i clic di attivazione del cassetto?

Problemi correlati