Как добавить индикатор "меню" рядом с значком приложения "Панель действий"?
По крайней мере, приложения Android Gmail и Youtube используют боковое меню (навигационный ящик?), который открывается путем прокрутки или нажатием значка приложения (кнопка "домой" ):
![enter image description here]()
Значок/значок меню на скриншоте выше готовой части Android SDK? (Или пользовательский значок, который Google использует в своих приложениях?) В любом случае , что самый простой способ заставить вашу домашнюю кнопку выглядеть так, то есть открыть меню?
(targetSdkVersion
18; minSdkVersion
14)
Решение
Наконец получил работу. Для меня не было 1) фактический значок и 2) отложенный вызов syncState()
на ActionBarDrawerToggle
.
Ответы
Ответ 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 помогли мне в правильном направлении,
Теперь, к сожалению, создание 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.