Подтвердить что ты не робот

Как добавить индикатор "меню" рядом с значком приложения "Панель действий"?

По крайней мере, приложения Android Gmail и Youtube используют боковое меню (навигационный ящик?), который открывается путем прокрутки или нажатием значка приложения (кнопка "домой" ):

enter image description here

Значок/значок меню на скриншоте выше готовой части Android SDK? (Или пользовательский значок, который Google использует в своих приложениях?) В любом случае , что самый простой способ заставить вашу домашнюю кнопку выглядеть так, то есть открыть меню?

(targetSdkVersion 18; minSdkVersion 14)

Решение

Наконец получил работу. Для меня не было 1) фактический значок и 2) отложенный вызов syncState() на ActionBarDrawerToggle.

4b9b3361

Ответ 1

Чтобы создать аналогичную реализацию/внешний вид в своем приложении, вы должны использовать ActionBarDrawerToggle и установить свой пользовательский значок в качестве индикатора рядом с кнопкой ActionBar home. Например:

import android.app.ActionBar;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;

private void setUpDrawerToggle(){
    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);

    // ActionBarDrawerToggle ties together the the proper interactions
    // between the navigation drawer and the action bar app icon.
    mDrawerToggle = new ActionBarDrawerToggle(
            this,                             /* host Activity */
            mDrawerLayout,                    /* DrawerLayout object */
            R.drawable.ic_drawer,             /* nav drawer image to replace 'Up' caret */
            R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
            R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
    ) {
        @Override
        public void onDrawerClosed(View drawerView) {
            invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }
    };

    // Defer code dependent on restoration of previous instance state.
    // NB: required for the drawer indicator to show up!
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

Где R.drawable.ic_drawer - фактически значок, который будет использоваться в качестве индикатора. Вы можете найти его в Android Asset Studio; см. Индикатор навигационного ящика.

Ссылки

Ответ 2

Android-разработчик и HpTerm помогли мне в правильном направлении,

  • Указывая, что это действительно NavigationDrawer (который я уже использовал, как в примере Google)
  • Расскажите, где найти значок ic_drawer.png (→ Android Asset Studio)

Теперь, к сожалению, создание ActionBarDrawerToggle, как показано ниже, кажется not достаточным. По крайней мере, на моем тестовом устройстве Nexus 7 (API 18).

drawerToggle = new ActionBarDrawerToggle(this, 
                       drawerLayout, 
                       R.drawable.ic_navigation_drawer, 
                       R.string.side_menu_open, 
                       R.string.side_menu_closed) {
    // ...
};

Частичное решение (уровень API 18 +)

Я нашел один способ показать индикатор: setHomeAsUpIndicator(). Недостаток: этот метод был добавлен в уровень API 18.

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    getActionBar().setDisplayHomeAsUpEnabled(true); // also required
    if (Build.VERSION.SDK_INT >= 18) {
        getActionBar().setHomeAsUpIndicator(
            getResources().getDrawable(R.drawable.ic_navigation_drawer));
    }
}

Итак, теперь остается вопрос: как сделать эту работу (в моем случае) для уровней API с 14 по 17?

Я проверил на устройстве 4.1.2 (API 16), что значок ic_drawer показывает не. С setDisplayHomeAsUpEnabled(true) я получаю обычный "домашний" значок (маленькая стрелка, указывающая влево), и без него пробел, оставшийся до моего значка приложения, остается пустым.

Окончательное решение

С помощью отредактированной версии ответа разработчика Android

Довольно любопытно, что отсутствовало в моем инициализационном коде ActionBarDrawerToggle следующее:

   // Defer code dependent on restoration of previous instance state.
   drawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

При включенном вызове setHomeAsUpIndicator() требуется не.

Ответ 3

Ключевое слово здесь NavigationDrawer; есть пример рабочего кода на сайте разработчика Android.

ПРОЧИТАЙТЕ КОНЕЦ ЛИНИИ, ПРЕДОСТАВЛЕННОЙ. Откройте и закройте значок приложения.

Следующий код копируется оттуда

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    ...

    public void onCreate(Bundle savedInstanceState) {
        ...

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  /* host Activity */
                mDrawerLayout,         /* DrawerLayout object */
                R.drawable.ic_drawer,  /* nav drawer icon to replace 'Up' caret */
                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) {
                getActionBar().setTitle(mTitle);
            }

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

        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);

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

    @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 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;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }

    ...
}

Некоторые файлы доступны для загрузки, а малые 3 строки с эффектом анимации полностью иллюстрируются.

Вам нужно скопировать файлы thoses в соответствующую папку drawable. В зависимости от темы, которую вы используете, темный или светлый, у вас есть другой набор значков.

В моем случае я просто скопировал drawer_shadow.9.png и ic_drawer.png в выпадающей папке и последовал примеру, и все работает отлично.

Значки доступны в ссылке, которую я предоставил, но они НЕ в "Панели значков панели действий", находятся в примерном приложении в соответствующие папки res/drawable.