Android DrawerLayout не показывает значок правильного индикатора
Я пытаюсь использовать новый DrawerLayout для списка. Проблема в том, что я установил прослушиватель ящика, индикатор на панели действий по-прежнему остается значком стрелки, а не значком 3 строки, который я намереваюсь нарисовать. Ниже приведена функция OnCreate:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_front_page);
// Swiping Pager set up
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
// Sliding Drawer set up
mHabitContract = new HabitsContract(this);
mDrawerLayout = (DrawerLayout) findViewById(R.id.front_page_layout);
mDrawerList = (ListView) findViewById(R.id.habit_list);
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
mDrawerList.setAdapter(new HabitAdapter(mHabitContract.GetHabitItems(), this));
// Fixme: Indicator image doesn't show up
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_navigation_drawer, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
//getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
//getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
// Action Bar set up
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
getActionBar().setDisplayShowHomeEnabled(true);
}
Может ли кто-нибудь помочь?
Обновление: Я нашел проблему. Я добавил функцию onPostCreate следующим образом, и теперь она работает.
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
Ответы
Ответ 1
Вам нужен syncState()
вызов вашего объекта ActionBarDrawerToggle
из onPostCreate()
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
Ответ 2
Для тех, кто ищет это или пришел сюда в поисках ответа: вы должны использовать DrawerToggle support.v7. После того, как я его использую:
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_opened, R.string.drawer_closed){
public void onDrawerClosed(View view){
//actionBar.setTitle(mTitle);
invalidateOptionsMenu(); // crea la llamada para onPrepareOptionsMenu
}
public void onDrawerOpened(View view){
//actionBar.setTitle(mDrawerTitle);
invalidateOptionsMenu(); // crea la llamda para onPrepareOptionsMenu
}
};
Это прекрасно работает и имеет анимацию, которая потрясает!
Ответ 3
Значок, который вы используете, называется "ic_navigation_drawer". Вы можете проверить, является ли он правильным, потому что значок, который Google предлагает в официальном руководстве (http://developer.android.com/training/implementing-navigation/nav-drawer.html), называется "ic_drawer".
Ответ 4
Также внимательно проверьте, если пользовательская тема ActionBar
определена в вашем проекте в файле style.xml
с условием android:displayOptions=showTitle
. Вот так:
<style name="OrangeBar" parent="@android:style/Widget.Holo.ActionBar">
<item name="android:displayOptions">showTitle</item>
...
</style>
и он может испортить индикатор ящика. Чтобы избежать этого, добавьте showHome
в android:displayOptions
:
<item name="android:displayOptions">showHome|showTitle</item>