2015-04-06 8 views
5

sto usando ScrimInsetsFrameLayout per ottenere il Navigation Drawer sul ToolBar con l'StatusBar su di esso quindi ho seguito la guida e leggere molto su di esso, ma c'è qualcosa che non va, anche se non mi manca nulla.Ottenere un errore utilizzando ScrimInsetFrameLayout

Ogni volta che si fa clic su una (delle quattro) attività nello drawer_listView o ic_drawer, la forza dell'app si chiude senza messaggi nello Logcat.

MainActivity

public class MainActivity extends ActionBarActivity { 

DrawerLayout mDrawerLayout; 
ListView mDrawerList; 
ActionBarDrawerToggle mDrawerToggle; 
String[] mDrawerListItems; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 

    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); 

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer); 
    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.primaryDark)); 
    mDrawerList = (ListView)findViewById(android.R.id.list); 
    mDrawerListItems = getResources().getStringArray(R.array.drawer_list); 
    mDrawerList.setAdapter(new ArrayAdapter<> 
      (this, android.R.layout.simple_list_item_1, mDrawerListItems)); 
    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      openFragment(position); 
     } 
    }); 
    mDrawerToggle = new ActionBarDrawerToggle(this, 
      mDrawerLayout, 
      toolbar, 
      R.string.drawer_open, 
      R.string.drawer_close){ 
     public void onDrawerClosed(View v){ 
      super.onDrawerClosed(v); 
      invalidateOptionsMenu(); 
      syncState(); 
     } 
     public void onDrawerOpened(View v){ 
      super.onDrawerOpened(v); 
      invalidateOptionsMenu(); 
      syncState(); 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    mDrawerToggle.syncState(); 
} 

protected void openFragment(int position){ 

    mDrawerLayout.closeDrawer(mDrawerList); 

    switch (position) { 
     case 0: 
      startActivity(new Intent(this, WIND.class)); 
      break; 
     case 1: 
      startActivity(new Intent(this, GEO.class)); 
      break; 
     case 2: 
      startActivity(new Intent(this, COMPASS.class)); 
      break; 
     case 3: 
      startActivity(new Intent(this, BARO_ALTI.class)); 
      break; 
     default: 
      break; 
    } 

} 

@Override 
protected void onPostCreate(Bundle savedInstanceState){ 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item){ 
    switch (item.getItemId()){ 
     case android.R.id.home: { 
      if (mDrawerLayout.isDrawerOpen(mDrawerList)){ 
       mDrawerLayout.closeDrawer(mDrawerList); 
      } else { 
       mDrawerLayout.openDrawer(mDrawerList); 
      } 
      return true; 
     } 
     default: return super.onOptionsItemSelected(item); 
    } 
} 

my_activity.xml:

<?xml version="1.0"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:id="@+id/drawer" 
    tools:context=".MainActivity" 
    android:fitsSystemWindows="true"> 

<FrameLayout 
    android:orientation="vertical" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"> 

    <android.support.v7.widget.Toolbar 
     android:layout_height="?attr/actionBarSize" 
     android:layout_width="match_parent" 
     app:popupTheme="@style/Theme.AppCompat" 
     app:theme="@style/ToolbarTheme" 
     android:background="@color/primary" 
     android:id="@+id/toolbar"/> 

    <FrameLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:id="@+id/content_frame"> 

    </FrameLayout> 

</FrameLayout> 

<beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/linearLayout" 
    android:layout_width="304dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:insetForeground="#4000"> 

    <ListView 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:background="#ffffffff" 
     android:divider="#ffffffff" 
     android:dividerHeight="8dp" 
     android:id="@android:id/list" 
     android:layout_gravity="start" 
     android:scrollbars="none"/> 

</beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout> 

Il mio problema è limitato a my_activity.xml. Per favore aiutatemi, non posso continuare il mio progetto.

[Update]

ho fatto il mio layout esattamente come ha fatto https://github.com/google/iosched/blob/master/android/src/main/res/layout/activity_map.xml ma ** perché non sto ottenendo lo stesso risultato ?! **

<?xml version="1.0"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:id="@+id/drawer" 
    tools:context=".MainActivity" 
    android:fitsSystemWindows="true"> 

<beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/linearLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    app:insetForeground="#4000"> 

    <FrameLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:id="@+id/content_frame"> 

    </FrameLayout> 

    <android.support.v7.widget.Toolbar 
     android:layout_height="?attr/actionBarSize" 
     android:layout_width="match_parent" 
     app:popupTheme="@style/Theme.AppCompat" 
     app:theme="@style/ToolbarTheme" 
     android:background="@color/primary" 
     android:id="@+id/toolbar"/> 

</beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout> 

<ListView 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:background="#ffffffff" 
     android:divider="#ffffffff" 
     android:dividerHeight="8dp" 
     android:id="@android:id/list" 
     android:layout_gravity="start" 
     android:scrollbars="none"/> 

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

Il tuo 'my_activity.xm' ha un problema. Prova la mia risposta per [post] (http: // StackOverflow.it/questions/29363085/navigation-menuitem-in-toolbar-doesnt-trigger-onoptionsitemselected/29363848 # 29363848) – Xcihnegn

+0

@Xcihnegn Come posso ottenere l'effetto nell'immagine sopra se non ho _.ScrimInsetsFrameLayout_? – Rick

+0

Non ho detto di averlo rimosso, basta modificare il layout in base alla mia risposta – Xcihnegn

risposta

4

In poche parole setSupportActionBar(toolbar); poco meno Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);

Ora dovrebbe essere in grado di fare clic su ic_drawer per aprire drawer_layout.

(non sarà in grado di fare clic su un'attività di tale elenco, cercherò di ottenere tale questione io aggiornare la mia risposta domani.)

Edit:

public class MainActivity extends ActionBarActivity { 

DrawerLayout mDrawerLayout; 
ListView mDrawerList; 
ActionBarDrawerToggle mDrawerToggle; 
String[] mDrawerListItems; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 

    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer); 
    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.primaryDark)); 

    mDrawerListItems = getResources().getStringArray(R.array.drawer_list); 

    mDrawerList = (ListView)findViewById(android.R.id.list); 
    mDrawerList.setAdapter(new ArrayAdapter<> 
      (this, android.R.layout.simple_list_item_1, mDrawerListItems)); 
    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      openFragment(position); 
     } 
    }); 
    mDrawerToggle = new ActionBarDrawerToggle(this, 
      mDrawerLayout, 
      toolbar, 
      R.string.drawer_open, 
      R.string.drawer_close){ 
     public void onDrawerClosed(View v){ 
      super.onDrawerClosed(v); 
      invalidateOptionsMenu(); 
      syncState(); 
     } 
     public void onDrawerOpened(View v){ 
      super.onDrawerOpened(v); 
      invalidateOptionsMenu(); 
      syncState(); 
     } 
    }; 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); 
} 

protected void openFragment(int position){ 

    Intent intent; 
    switch (position) { 
     case 0: 
      intent = new Intent(this, Activity1.class); 
      break; 
     case 1: 
      intent = new Intent(this, Activity2.class); 
      break; 
     case 2: 
      intent = new Intent(this, Activity3.class); 
      break; 
     case 3: 
      intent = new Intent(this, Activity4.class); 
      break; 
     default: 
      intent = null; 
    } 
    startActivity(intent); 
    //mDrawerLayout.closeDrawer(mDrawerList);  

} 

@Override 
protected void onPostCreate(Bundle savedInstanceState){ 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item){ 
    switch (item.getItemId()){ 
     case android.R.id.home: { 
      if (mDrawerLayout.isDrawerOpen(mDrawerList)){ 
       mDrawerLayout.closeDrawer(mDrawerList); 
      } else { 
       mDrawerLayout.openDrawer(mDrawerList); 
      } 
      return true; 
     } 
     default: return super.onOptionsItemSelected(item); 
    } 
} 
+0

In realtà sì, ha l'effetto che stavo cercando. Aspetterò l'aggiornamento – Rick

+0

Scusate amico, ero impegnato per il mio lavoro. Controlla la modifica e sostituisci semplicemente – Pier

+0

Grazie a @Pier, ora funziona perfettamente :) – Rick

1

fare windowActionBar true negli stili Prova questo e la navigazione dovrebbe andare sotto

+0

Ho provato, ma ho ancora il problema – Rick

-1
<?xml version="1.0"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 


<android.support.v7.widget.Toolbar 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_height="?attr/actionBarSize" 
    android:layout_width="match_parent" 
    app:popupTheme="@style/Theme.AppCompat" 
    app:theme="@style/ToolbarTheme" 
    android:background="@color/primary" 
    android:id="@+id/toolbar"/> 


<android.support.v4.widget.DrawerLayout 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:id="@+id/drawer" 
    tools:context=".MainActivity" 
    > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" >  

<FrameLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:id="@+id/content_frame"/> 

</LinearLayout> 

<beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/linearLayout" 
    android:layout_width="304dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:insetForeground="#4000"> 

    <ListView 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:background="#ffffffff" 
    android:divider="#ffffffff" 
    android:dividerHeight="8dp" 
    android:id="@android:id/list" 
    android:layout_gravity="start" 
    android:scrollbars="none"/> 

</beta_toolbox.pier.beta_toolbox.ScrimInsetsFrameLayout> 

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

</LinearLayout> 


[UPDATE ]

Secondo Android doc:

public void syncState() 

Questo dovrebbe essere chiamato dal metodo onPostCreate del vostro attività per sincronizzare dopo stato dell'istanza del DrawerLayout è stato restaurato, e qualsiasi altro momento in cui lo Stato può aver discostato in modo tale che l'ActionBarDrawerToggle non è stato notificato. (Per esempio, se ci si ferma spedizioni appropriati eventi cassetto per un periodo di tempo.)

Così si può cercare di rimuovere tutte le altre di chiamata syncState()

+0

Ho copiato e incollato ma non riesco ancora a fare clic né sul cassetto né sul drawable. Ad ogni modo il ND è sotto la barra degli strumenti quando lo apro – Rick

+0

Mi è piaciuto come hai detto ma nulla cambia .... Non so perché – Rick

+0

ho appena modificato di nuovo il layout, puoi provare, meglio copiare tutto – Xcihnegn

Problemi correlati