Переключить DrawerLayout только с заголовком (без значка приложения)?

У меня есть активность с DrawerLayout. Я могу открыть ящик двумя разными способами... проведя пальцем от левой области экрана вправо и щелкнув название приложения. У меня НЕ отображается значок приложения, только заголовок. Я реализовал это точно так, как рекомендовал Google здесь: Создание панели навигации: открытие и закрытие со значком приложения

Все функционально, вплоть до открывания и закрывания самого ящика. Однако он не отображает стандартный значок DrawerLayout, который предполагается использовать. Вместо этого я получаю обычную каретку вверх (выглядит как знак меньше).

Как только я добавляю значок приложения обратно в ActionBar, он начинает работать, как и ожидалось. Значок макета ящика отображается и анимируется, когда ящик открывается или закрывается. Я попытался удалить значок приложения как в XML-файле стилей, так и программно.

Есть ли способ заставить значок DrawerLayout работать БЕЗ значка приложения???

ОБНОВЛЕНИЕ: я нашел обходной путь, но это скорее хак, чем решение. Я просто создал прозрачный PNG размером 1x1 пиксель (blank.png) и установил его в качестве значка моего приложения в файле styles.xml. Ниже приведен весь относительный код:

styles.xml

<style name="MyCustomTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/MyCustomActionBar</item>
    <item name="android:icon">@drawable/blank</item>
</style>

<style name="MyCustomActionBar" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:displayOptions">showHome|showTitle|homeAsUp</item>
</style>

MainActivity -> onCreate()

this.navDrawerToggle = new ActionBarDrawerToggle
(
    this,
    this.navDrawerLayout,
    R.drawable.icon_nav_drawer,
    R.string.nav_drawer_open,
    R.string.nav_drawer_closed
)
{
    public void onDrawerClosed(View view) {}
    public void onDrawerOpened(View drawerView) {}
};

MainActivity -> onPostCreate()

super.onPostCreate(savedInstanceState);
this.navDrawerToggle.syncState();

MainActivity -> onResume()

this.navDrawer.setOnItemClickListener(new DrawerItemClickListener());
this.navDrawerLayout.setDrawerListener(this.navDrawerToggle);

MainActivity -> onPause()

this.navDrawer.setOnItemClickListener(null);
this.navDrawerLayout.setDrawerListener(null);

MainActivity -> onConfigurationChanged(Configuration newConfig)

super.onConfigurationChanged(newConfig);
navDrawerToggle.onConfigurationChanged(newConfig);

MainActivity -> onOptionsItemSelected(элемент MenuItem)

if (this.navDrawerToggle.onOptionsItemSelected(item)) {return true;}
else
{
    // A bunch of item click handling happens here...

    return true;
}

person Jabari    schedule 18.06.2013    source источник
comment
В качестве примечания: в следующий раз, пожалуйста, добавьте код, чтобы знать, с чем вы работаете.   -  person velazcod    schedule 18.06.2013
comment
Смотрите мое обновление ниже. Использование setDisplayOptions вместо попытки установить их в стиле исправляет это.   -  person velazcod    schedule 18.06.2013


Ответы (3)


getActionBar().setIcon(android.R.color.transparent);

Это сработало для меня..... ;)

person karan    schedule 17.09.2015
comment
Когда я опубликовал это (несколько версий Android назад), это было одной из первых вещей, которые я попробовал. Это работало функционально, но значок все еще занимал то же место. Разве это не так сейчас? Если нет, я сделаю это новым принятым ответом после тестирования. - person Jabari; 18.09.2015
comment
о какой версии вы говорите. Я тестировал на 5.1 (lolipop) и 4.4.2 (kit kat), обе работают нормально. - person karan; 18.09.2015
comment
Этому посту больше 2 лет, и я пытался сохранить обратную совместимость, поэтому Ice Cream Sandwich и Gingerbread (мне было наплевать на Honecomb). Ответ принят! - person Jabari; 18.09.2015

Мне было любопытно, поэтому я попробовал это с образцом для DrawerLayout, и он работал нормально. Кроме того, похоже, что вам нужно использовать свой собственный значок ящика, который можно нарисовать, в любом случае это рекомендуется. Вы можете загрузить активы по умолчанию с этого сайта Создание навигации Drawer и поместите их в соответствующую папку ресурсов для рисования.

Вот что сработало для меня:

ActionBar actionBar = getActionBar();

// Let's get rid of the app icon here
actionBar.setIcon(null);
actionBar.setTitle("App Name");

// Setting these 3 options allows us to show the title as well as a "Home" elements
// "Home" elements include the Up and/or Drawer icon. The DISPLAY_HOME_AS_UP will enable
// and show the Drawer icon, we'll be "replacing" the "up" button with the drawer icon below
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE 
        | ActionBar.DISPLAY_SHOW_HOME 
        | ActionBar.DISPLAY_HOME_AS_UP);

// Get a reference of the DrawerLayout
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerLayout.setDrawerListener(drawerToggle);

// Setting ActionBarDrawerToggle will allow you to set the drawables for the drawer
// (this will also give you the nice/smooth animation) as well as allow you to do some
// other things depending on the events: onDrawerClosed & onDrawerOpened.
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(
          this,                   /* host Activity */
          drawerLayout,           /* DrawerLayout object */
          R.drawable.ic_drawer,   /* nav drawer image to replace 'Up' caret */
          R.string.drawer_open,   /* "open drawer" description for accessibility */
          R.string.drawer_closed  /* "close drawer" description for accessibility */
      ) {
    public void onDrawerClosed(View view) {
        actionBar.setTitle("Closed...");
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
    }

    public void onDrawerOpened(View drawerView) {
        actionBar.setTitle("Open...");
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
    }
};

// Set a listener to be notified of drawer events.
drawerLayout.setDrawerListener(drawerToggle);

ОБНОВЛЕНИЕ: кажется, что android:displayOptions в стиле ActionBar не учитываются. Вместо этого используйте actionBar.setDisplayOptions(int options).

person velazcod    schedule 18.06.2013
comment
То, что вы перечислили выше, почти то же самое, что я реализовал, за исключением двух вещей. 1) Я не использовал actionbar.setIcon(null). Вместо этого я использовал actionbar.setDisplayShowHomeEnabled(false). 2) В конце концов я отказался от программного изменения ActionBar и вместо этого изменил их в моем файле styles.xml, включая параметры отображения. Я собираюсь добавить actionbar.setIcon(null) и посмотреть, что произойдет... - person Jabari; 18.06.2013
comment
setDisplayShowHomeEnabled(false) примерно то же самое, что и отсутствие опции ActionBar.DISPLAY_SHOW_HOME. Вам нужно либо установитьDisplayShowHomeEnabled(true), либо установить параметр. - person velazcod; 18.06.2013
comment
Все еще не работал для меня. Вы используете ActionBarSherlock (я нет). У меня тоже стоит 4.2.2. Я уже удалил setDisplayShowHomeEnabled(false). Я нашел временное решение... Я просто создал прозрачный PNG размером 1x1 пиксель и использовал его в качестве значка своего приложения (через файл styles.xml). Это просто похоже на взлом. - person Jabari; 18.06.2013
comment
ОП обновляется кодом. Кроме того, завтра на DrawLayout состоится живая видеовстреча Google Developers. Я разместил свою проблему в комментариях, и один из разработчиков считает, что это может быть ошибка... - person Jabari; 18.06.2013
comment
i.imgur.com/CSlC5q7.png Избавьтесь от android:displayOptions в стиле панели действий. и используйте actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP); - person velazcod; 18.06.2013
comment
Престо... сработало! Я понятия не имею, почему это работает программно, а не через стили. Причина, по которой я предпочитаю делать это в файле styles.xml, заключается в том, что при запуске приложения нет задержки загрузки. Этот способ работает, но когда приложение загружается впервые, я все еще вижу значок на короткое время. Во всяком случае ... Я вижу, вы добавили обновление, поэтому я делаю это как правильный ответ! - person Jabari; 19.06.2013
comment
Одна вещь, которую я делаю, это сделать панель действий в теме скрытой по умолчанию, а затем показать ее в действии после настройки моего пользовательского макета панели действий. Таким образом, вы не увидите, как стиль панели действий мерцает, как в случае, если вы используете настраиваемый макет или значок приложения отсутствует на панели действий. Тем не менее, я могу это сделать, так как я сильно полагаюсь на фрагменты и имею только несколько действий, и я могу справиться с этим поведением с минимальными усилиями и повторным использованием кода. Удачи. - person velazcod; 19.06.2013
comment
Я не понимаю... как при использовании ActionBar.DISPLAY_SHOW_HOME не отображается значок дома? - person Jason Robinson; 03.10.2013

После установки переключателя ящика вам нужно вызвать следующий метод:

 mDrawerToggle.syncState();

поэтому ваш код будет выглядеть так:

 mDrawerToggle = new ActionBarDrawerToggle(
            this,                  /* host Activity */
            mDrawerLayout,         /* DrawerLayout object */
            R.drawable.ic_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) {
            actionBar.setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }


        public void onDrawerOpened(View drawerView) {
            actionBar.setTitle("Preview Mode");
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    };

    mDrawerToggle.syncState();
    mDrawerLayout.setDrawerListener(mDrawerToggle);
person j2emanue    schedule 03.10.2013