2015-05-01 3 views
1

У меня был ящик для навигации, работающий некоторое время назад, но затем я решил обновить его, чтобы использовать Toolbar вместо панели действий по умолчанию. Теперь у меня есть ситуация, когда я нажимаю меню гамбургера, навигационный ящик не открывается. Тем не менее, я могу скользить слева направо и открывать его. Проблема в том, что теперь она пуста.Ящик навигации на леденец пуст после добавления панели инструментов

значения-V21/styles.xml

<style name="Material" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/app_green</item> 
    <item name="colorPrimaryDark">@color/app_green_dark</item> 
    <item name="android:textColorPrimary">@color/action_bar_text</item> 
    <item name="android:textColor">@color/secondary_text_color</item> 
    <item name="android:color">@color/secondary_text_color</item> 
    <item name="android:colorAccent">@color/app_green</item> 
    <item name="android:editTextColor">@color/secondary_text_color</item> 

    <item name="textHeaderMaxLines">@integer/text_header_max_lines</item> 
    <item name="trackAbstractMaxLines">@integer/track_abstract_max_lines</item> 
    <item name="activatableItemBackground">@drawable/activatable_item_background</item> 

    <!-- ActionBar Styles --> 
    <item name="android:windowNoTitle">true</item> 
    <!--We will be using the toolbar so no need to show ActionBar--> 
    <item name="android:windowActionBar">false</item> 

    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
    <item name="android:statusBarColor">?android:attr/colorPrimaryDark</item> 

    <!-- Global UI Assignments --> 
    <item name="android:spinnerStyle">@style/Material.Widget.Spinner</item> 

    <item name="android:buttonStyle">@style/Material.Widget.Button</item> 
    <item name="android:checkboxStyle">@style/Material.Widget.Checkbox</item> 
    <item name="android:textAppearance">@android:style/TextAppearance</item> 

    <item name="android:popupWindowStyle">@style/Material.Window.Popup</item> 

    <!-- ViewPager --> 
    <item name="vpiCirclePageIndicatorStyle">@style/Material.Activity.Login.ViewPagerIndicator.CustomCircle</item> 
    <item name="buttonBarStyle">?android:buttonBarStyle</item> 
    <item name="buttonBarButtonStyle">?android:buttonBarButtonStyle</item> 
    <item name="indeterminateProgressStyle">?android:indeterminateProgressStyle</item> 
</style> 

navigation_drawer.xml

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true"> 

<!-- The main content view. Must be first child because XML ordering implies stacking 
context --> 
<LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:orientation="vertical"> 

    <!-- Our App Bar. Placed here so we can draw over it with the navigation drawer. --> 
    <android.support.v7.widget.Toolbar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/app_bar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:minHeight="?android:attr/actionBarSize" 
     android:background="?android:attr/colorPrimary" /> 

    <!-- Our actual content view. --> 
    <FrameLayout 
     android:id="@+id/drawer_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" /> 

</LinearLayout> 

<!-- The navigation drawer itself. --> 
<ListView 
    android:id="@+id/drawer_list" 
    android:layout_width="300dp" 
    android:layout_height="match_parent" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    android:layout_gravity="start" 
    android:background="@android:color/white" 
    android:fitsSystemWindows="true" 
/> 

NavigationDr awerActivity.java

public class NavigationDrawerActivity extends ActionBarActivity 
    implements AdapterView.OnItemClickListener { 

    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private LayoutInflater mInflater; 
    private NavDrawerItemAdapter mAdapter; 
    private ActionBarDrawerToggle mDrawerToggle; 

    // Our "App bar". This will only be populated if the current SDK is >= 21. Otherwise, we'll use an 
    // action bar that will be populated when the app first starts. 
    private Toolbar mAppBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.navigation_drawer); 
    mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    setupNavigationDrawer(); 
    } 

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

    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
    } 

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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    // Pass the event to ActionBarDrawerToggle, if it returns 
    // true, then it has handled the app icon touch event 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
    } 

    /** 
    * Toggles the state of the navigation drawer (i.e. closes it if it's open, and opens it if 
    * it's closed). 
    */ 
    public void toggleNavigationDrawer() { 
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { 
     closeNavigationDrawer(); 
    } else { 
     openNavigationDrawer(); 
    } 
    } 

    /** 
    * Opens the navigation drawer. 
    */ 
    public void openNavigationDrawer() { 
    mDrawerLayout.openDrawer(GravityCompat.START); 
    } 

    /** 
    * Closes the navigation drawer. 
    */ 
    public void closeNavigationDrawer() { 
    mDrawerLayout.closeDrawer(GravityCompat.START); 
    } 

    /** 
    * Initializes items specific to the navigation drawer. 
    */ 
    private void setupNavigationDrawer() { 
    mDrawerLayout = (DrawerLayout) mInflater.inflate(R.layout.navigation_drawer, null); // "null" is important. 
    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.app_green)); 

    // We want to use the toolbar if the version is 21 or greater, because is has more flexibility 
    // than the standard ActionBar 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     mAppBar = (Toolbar) findViewById(R.id.app_bar); 
     setSupportActionBar(mAppBar); 
    } 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setHomeButtonEnabled(true); 
    actionBar.setDisplayShowHomeEnabled(false); 

    mDrawerToggle = new ActionBarDrawerToggle(
     this,     /* Our context (Activity that hosts this drawer) */ 
     mDrawerLayout,   /* The DrawerLayout where the nav drawer will be drawn */ 
     mAppBar,    /* The Toolbar that is being used as an app bar. */ 
     R.string.drawer_open, /* Description of "open drawer", for accessibility */ 
     R.string.drawer_close /* Description of "close drawer", for accessibility */ 
    ) { 

     /** 
     * Called when a drawer has settled in a completely closed state. 
     */ 
     public void onDrawerClosed(View view) { 
     super.onDrawerClosed(view); 
     supportInvalidateOptionsMenu(); 
     } 

     /** 
     * Called when a drawer has settled in a completely open state. 
     */ 
     public void onDrawerOpened(View drawerView) { 
     super.onDrawerOpened(drawerView); 
     supportInvalidateOptionsMenu(); 
     } 
    }; 

    mDrawerList = (ListView) mDrawerLayout.findViewById(R.id.drawer_list); 

    NavDrawerGroup userToolsGroup = new NavDrawerGroup(R.string.drawer_group_usertools, false, 1); 
    NavDrawerGroup toolBoxGroup = new NavDrawerGroup(R.string.drawer_group_toolbox, true, 2); 
    NavDrawerGroup supportGroup = new NavDrawerGroup(R.string.drawer_group_support, true, 3); 

    NavDrawerItem[] navDrawerItems = { 
     new NavDrawerItem(R.string.drawer_item_main, R.drawable.ic_main, NavDrawerGroup.DEFAULT_GROUP), 
     new NavDrawerItem(R.string.drawer_item_tool_one, R.drawable.ic_tool_one, NavDrawerGroup.DEFAULT_GROUP), 
     new NavDrawerItem(R.string.drawer_item_tool_two, R.drawable.ic_tool_two, userToolsGroup), 
    }; 

    mAdapter = new NavDrawerItemAdapter(this, navDrawerItems); 
    mDrawerList.setAdapter(mAdapter); 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerList.setOnItemClickListener(this); 
    } 
} 

Я знаю NavDrawerItem материал выглядит своего рода шаткий, но я проверил, что он работает со старой навигации ящика (до панели инструментов), и все это на самом деле делает это какая-то логика для заполнения ListView элементы с иконкой и поместите их в соответствующую группу. Поэтому я уверен, что это не проблема.

Даже если бы это было, я должен был получить что-то другое, кроме пустого белого фона, потому что макет для ящика навигации фактически устанавливает заголовок для ListView, который имеет зеленый фон, который я не вижу.

Edit:

В соответствии с @ blacksh33p Замечаний ниже, я удалил код, который обрабатывается различные уровни API по-разному, и изменил mDrawerToggle конструктор:

Hm, ни радости. Я удалил условное определение уровня API, и только инициализирован Toolbar, а затем изменил mDrawerToggle на следующее:

mDrawerToggle = new ActionBarDrawerToggle(
    this,     /* Our context (Activity that hosts this drawer) */ 
    mDrawerLayout,   /* The DrawerLayout where the nav drawer will be drawn */ 
    mAppBar,    /* The Toolbar that is being used as an app bar. */ 
    R.string.drawer_open, /* Description of "open drawer", for accessibility */ 
    R.string.drawer_close /* Description of "close drawer", for accessibility */ 
) { 

    /** 
    * Called when a drawer has settled in a completely closed state. 
    */ 
    public void onDrawerClosed(View view) { 
    super.onDrawerClosed(view); 
    supportInvalidateOptionsMenu(); 
    } 

    /** 
    * Called when a drawer has settled in a completely open state. 
    */ 
    public void onDrawerOpened(View drawerView) { 
    super.onDrawerOpened(drawerView); 
    supportInvalidateOptionsMenu(); 
    } 
}; 

Но, в конечном итоге с тем же результатом. :(

+0

Кроме того, я заметил, что когда я запустить приложение в отладчике, он не ударил точки останова, установленные в 'onDrawerOpened()' или 'onDrawerClosed()', даже когда я покинул прикосновение, чтобы открыть навигационный ящик. – jwir3

ответ

2

Удалить код из onCreate и добавить в setContentView

передать этот DrawerActivity это может помочь .. !!

public class DrawerActivity extends ActionBarActivity { 

protected ActionBarDrawerToggle mDrawerToggle; 
private String[] mModulesTitles; 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private Intent intent; 
private TypedArray navMenuIcons; 
private ArrayList<NavDrawerItem> navDrawerItems; 
private NavDrawerListAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@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 onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    getMenuInflater().inflate(R.menu.options, menu); 
    return super.onCreateOptionsMenu(menu); 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 

     return true; 
    } 
    switch (item.getItemId()) { 
    case R.id.action_search: 
     intent = new Intent(this, JoinLeagueActivity.class); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out); 
     return true; 

    case R.id.action_add: 
     intent = new Intent(this, CreateLeagueActivity.class); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out); 
     return true; 

    case R.id.contactUs: 
     FragmentManager fm = this.getSupportFragmentManager(); 
     DialogFragment dialog = new ContactUsDialogFragment(); // creating new object 
     dialog.show(fm, "dialog"); 
     return new ContactUsDialogFragment() != null; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public void setContentView(final int layoutResID) { 

    View fullLayout = (DrawerLayout) getLayoutInflater().inflate(
      R.layout.layout_drawer, null); 

    FrameLayout actContent = (FrameLayout) fullLayout 
      .findViewById(R.id.content_frame); 

    mModulesTitles = getResources().getStringArray(R.array.modules_array); 
    mDrawerLayout = (DrawerLayout) fullLayout 
      .findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) fullLayout.findViewById(R.id.left_drawer); 
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    // nav drawer icons from resources 
    navMenuIcons = getResources() 
      .obtainTypedArray(R.array.nav_drawer_icons); 


    navDrawerItems = new ArrayList<NavDrawerItem>(); 

    // adding nav drawer items to array 
    // Home 
    navDrawerItems.add(new NavDrawerItem(mModulesTitles[0], navMenuIcons.getResourceId(0, -1))); 
    // Find People 
    navDrawerItems.add(new NavDrawerItem(mModulesTitles[1], navMenuIcons.getResourceId(1, -1))); 
    // Photos 
    navDrawerItems.add(new NavDrawerItem(mModulesTitles[2], navMenuIcons.getResourceId(2, -1))); 
    // Communities, Will add a counter here 
    navDrawerItems.add(new NavDrawerItem(mModulesTitles[3], navMenuIcons.getResourceId(3, -1))); 
    // Pages 
    navDrawerItems.add(new NavDrawerItem(mModulesTitles[4],-1)); 
    // What's hot, We will add a counter here 
    navDrawerItems.add(new NavDrawerItem(mModulesTitles[5], -1)); 
    navDrawerItems.add(new NavDrawerItem(mModulesTitles[6], -1)); 

    // Recycle the typed array 
    navMenuIcons.recycle(); 
    adapter = new NavDrawerListAdapter(getApplicationContext(), 
      navDrawerItems); 
    mDrawerList.setAdapter(adapter); 
//  mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mModulesTitles)); 
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    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); 
      getActionBar().setTitle(R.string.app_name); 
     } 

     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      getActionBar().setTitle(R.string.app_name); 
     } 
    }; 
    Log.e("[email protected]@@", "" + mDrawerLayout); 

    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    getLayoutInflater().inflate(layoutResID, actContent, true); 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    super.setContentView(fullLayout); 
} 

public class DrawerItemClickListener implements 
     ListView.OnItemClickListener { 
    public DrawerItemClickListener() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     selectItem(position); 
    } 
} 
private void selectItem(int position) { 
    // update selected item and title, then close the drawer 
    mDrawerList.setItemChecked(position, true); 
    setTitle(mModulesTitles[position]); 
    mDrawerLayout.closeDrawer(mDrawerList); 
    if (position == 0) { 
     Intent intent = new Intent(this, DashboardActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); 
    } 
    if (position == 1) { 
     Intent intent = new Intent(this, LeagueActivity.class); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); 
    } 
    if (position == 2) { 
     Intent intent = new Intent(this, MatchupActivity.class); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); 
    } 
    if (position == 3) { 
     Intent intent = new Intent(this, HelpActivity.class); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); 
    } 
    if (position == 4) { 
     Intent intent = new Intent(this, PrivacyActivity.class); 
     intent.putExtra("from_register", false); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); 
    } 
    if (position == 5) { 
     Intent intent = new Intent(this, TermsActivity.class); 
     intent.putExtra("from_register", false); 
     startActivity(intent); 
     overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); 
    } 
    if (position == 6) { 
     SharedPreferenceUtil.putValue("loginStatus", false); 
     Intent intent = new Intent(this, LoginActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 
     this.finish(); 
     overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out); 
    } 
} 
} 
0

Я занимаюсь разработкой приложения, используя drawerLayout с моей собственной панели инструментов, и это так хорошо работает на устройстве (Android 5.0.1) Для того, чтобы сделать это, у меня есть XML макет так:.

<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 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:background="#F78B1E" 
     android:minHeight="?attr/actionBarSize" /> 


    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center_vertical"> 
     <!-- The main content view --> 
     <FrameLayout 
      android:id="@+id/content_frame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 
     <!-- The navigation drawer --> 
     <ListView 
      android:id="@+id/left_navigation" 
      android:layout_width="400dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:choiceMode="singleChoice" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="0dp" 
      android:background="#fff" 
     /> 
    </android.support.v4.widget.DrawerLayout> 
</LinearLayout> 
+0

После создания материала панель инструментов должна находиться внутри DrawerLayout. –

1

Поскольку вы расширяете ActionBarActivity, нет необходимости обрабатывать уровни API по-разному, вы можете использовать панель инструментов поддержки вниз API 7.

Я думаю, если вы используете другой ActionBarDrawerToggle конструктор ваш код будет работать. Попробуйте следующее:

mDrawerToggle = new ActionBarDrawerToggle(
     this,     /* Our context (Activity that hosts this drawer) */ 
     mDrawerLayout,   /* The DrawerLayout where the nav drawer will be drawn */ 
     R.string.drawer_open, /* Description of "open drawer", for accessibility */ 
     R.string.drawer_close /* Description of "close drawer", for accessibility */ 
    ) { 

     /** 
     * Called when a drawer has settled in a completely closed state. 
     */ 
     public void onDrawerClosed(View view) { 
     super.onDrawerClosed(view); 
     supportInvalidateOptionsMenu(); 
     } 

     /** 
     * Called when a drawer has settled in a completely open state. 
     */ 
     public void onDrawerOpened(View drawerView) { 
     super.onDrawerOpened(drawerView); 
     supportInvalidateOptionsMenu(); 
     } 
    }; 
+0

Спасибо, но это, похоже, не помогает. Я изменил конструктор, как вы упомянули выше, и удалил специальную обработку для API v21 и выше, но я все еще вижу, что я не могу открыть навигационный ящик с иконкой гамбургера, и когда я открываю его левым щелчком, полностью пустой. :( – jwir3

Смежные вопросы