Во-первых, это не дубликат любого из вопросов о «пропавших без вести гамбургерах» здесь, в SO. Связанный вопрос предлагает вызвать метод syncState, но, как ясно показано в приведенном ниже коде, я даже не использую ActionBarDrawerToggle. Я разрабатываю устройство под управлением Android Lollipop и хочу, чтобы в моем Activity были:
В верхней части моего приложения должно быть указано это. Как видите, мой основной контент выделен синим цветом. Я хотел, чтобы мой контент находился под панелью инструментов, поэтому я сделал панель инструментов прозрачной.
Я запустил свое приложение на устройстве и был удивлен, увидев, что значок гамбургера в моем ящике не отображается. Но когда я нажимаю на верхний левый угол экрана, ящик открывается, и я могу правильно видеть свои пункты меню.
Мой файл styles.xml выглядит так:
<?xml version = "1.0" encoding = "utf-8"?>
<resources xmlns:tools = "http://schemas.android.com/tools">
<style name = "AppTheme" parent = "Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name = "colorPrimary">@color/colorPrimary</item>
<item name = "colorPrimaryDark">@color/colorPrimaryDark</item>
<item name = "colorAccent">@color/colorAccent</item>
</style>
<style name = "AppTheme.Transparent">
<item name = "windowActionBarOverlay">true</item>
<item name = "android:windowContentOverlay">@null</item>
<item name = "colorPrimary">@android:color/transparent</item>
<item name = "android:windowDrawsSystemBarBackgrounds">true</item>
<item name = "android:statusBarColor">@android:color/transparent</item>
<item name = "android:windowTranslucentStatus">true</item>
<item name = "android:windowTranslucentNavigation">true</item>
</style>
<style name = "AppTheme.AppBarOverlay" parent = "ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name = "AppTheme.PopupOverlay" parent = "ThemeOverlay.AppCompat.Light"/>
</resources>
А вот и моя MainActivity:
public class LoginActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Toolbar toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.light_menu);
getSupportActionBar().setDisplayShowTitleEnabled(false);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if (navigationView != null) {
setupDrawerContent(navigationView);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
mDrawerLayout.closeDrawers();
return true;
}
});
}
}
Вот макеты, которые я использовал. Мой файл activity_login.xml, используемый в действии:
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:id = "@+id/drawer_layout"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
tools:openDrawer = "start">
<include layout = "@layout/app_bar_main"/>
<android.support.design.widget.NavigationView
android:id = "@+id/nav_view"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_gravity = "start"
android:fitsSystemWindows = "true"
app:headerLayout = "@layout/nav_header_main"
app:menu = "@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
app_bar_main.xml содержит мою панель инструментов, которая находится внутри RelativeLayout. Содержимое моего Activity находится в другом макете, content_main.xml
<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true">
<android.support.v7.widget.Toolbar
android:layout_width = "match_parent"
android:id = "@+id/custom_toolbar"
android:minHeight = "?attr/actionBarSize"
android:layout_height = "wrap_content"
app:popupTheme = "@style/AppTheme.PopupOverlay" />
<include layout = "@layout/content_main" />
</RelativeLayout>
content_main.xml:
<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<ImageView
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_alignParentTop = "true"
android:src = "@drawable/top" />
<FrameLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_alignParentBottom = "true">
<ImageView
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:src = "@drawable/back_login" />
<ImageView
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:src = "@drawable/front_login" />
</FrameLayout>
</RelativeLayout>
Вот мой AndroidManifest.xml:
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.myapp">
<application
android:name = ".MyApp"
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:roundIcon = "@mipmap/ic_launcher_round"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".LoginActivity"
android:theme = "@style/AppTheme.Transparent">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Может ли кто-нибудь помочь мне исправить это? Спасибо.
@NoumanCh Это другой вопрос. Я не использую ActionBarDrawerToggle.
Вы должны использовать ActionBarDrawerToggle для достижения ваших требований. Пожалуйста, попробуйте обновить существующий код, как показано ниже,
public class LoginActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Toolbar toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.light_menu);
getSupportActionBar().setDisplayShowTitleEnabled(false);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
mDrawerLayout.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if (navigationView != null) {
setupDrawerContent(navigationView);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
mDrawerLayout.closeDrawers();
return true;
}
});
}
}
R.string.navigation_drawer_open и R.string.navigation_drawer_close - это ресурсы @StringRes int.
Пожалуйста, обновите ваш файл strings.xml следующим образом.
<string name = "navigation_drawer_open">Open</string>
<string name = "navigation_drawer_close">Close</string>
Спасибо!
Привет, @AnupaDayaratne, спасибо, что нашли время ответить, но, к сожалению, это не работает. Кроме того, конструктор ActionBarDrawerToggle не принимает строки напрямую в качестве входных данных, а вместо этого использует идентификаторы ресурсов типа int.
Привет, я уже обновил свой ответ, R.string.navigation_drawer_open и R.string.navigation_drawer_close - это ресурсы @StringRes int. Пожалуйста, обновите ваш файл strings.xml следующим образом. <string name = "navigation_drawer_open">Open</string> <string name = "navigation_drawer_close">Close</string> Пожалуйста, попробуйте это и дайте мне знать об обновлениях. Спасибо!
Как вы сказали
I ran my app on the device and I was surprised to see that the hamburger icon for my drawer is not visible. But when I tap the upper-left corner of the screen, the drawer opens and I can see my menu items correctly.
Это означает, что в вашем занятии есть значок гамбургера, но цвет этого значка неправильный.
дважды проверьте свой R.drawable.light_menu
или используйте этот XML для создания значка векторного меню, который можно рисовать
создайте файл ресурсов с возможностью рисования внутри своего объекта и вставьте ниже код
ic_menu_black.xml
<vector xmlns:android = "http://schemas.android.com/apk/res/android"
android:width = "24dp"
android:height = "24dp"
android:viewportWidth = "24.0"
android:viewportHeight = "24.0">
<path
android:fillColor = "#FF000000"
android:pathData = "M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
</vector>
а затем установите
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_black);
вы увидите черный значок меню. вы можете изменить fillColor в соответствии с вашими потребностями
+ для добавления ic_menu_black.xml
Я исправил эту проблему:
Обертывание моей панели инструментов в AppBarLayout, например:
<android.support.design.widget.AppBarLayout
android:id = "@+id/app_bar"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:theme = "@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id = "@+id/custom_toolbar"
android:layout_width = "match_parent"
android:layout_height = "?attr/actionBarSize"
app:popupTheme = "@style/AppTheme.PopupOverlay"
app:theme = "@style/AppTheme.AppBarOverlay"/>
</android.support.design.widget.AppBarLayout>
2.Я поместил AppBarLayout непосредственно как дочерний элемент CoordinatorLayout, который, в свою очередь, является дочерним элементом DrawerLayout:
<android.support.v4.widget.DrawerLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:id = "@+id/drawer_layout"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true">
<android.support.design.widget.CoordinatorLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true">
<android.support.design.widget.AppBarLayout
android:id = "@+id/app_bar"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:theme = "@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id = "@+id/custom_toolbar"
android:layout_width = "match_parent"
android:layout_height = "?attr/actionBarSize"
app:popupTheme = "@style/AppTheme.PopupOverlay"
app:theme = "@style/AppTheme.AppBarOverlay"/>
</android.support.design.widget.AppBarLayout>
<include layout = "@layout/content_main" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id = "@+id/nav_view"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_gravity = "start"
android:fitsSystemWindows = "true"
app:headerLayout = "@layout/nav_header_main"
app:menu = "@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
Установка ViewOutlineProvider AppBarLayout в значение null, чтобы не было тени под AppBarLayout. Я понял идею из этого ответа: https://stackoverflow.com/a/39699464/4612653. Вот мой MainActivity.java:
открытый класс MainActivityextends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initToolbar();
initInstances();
}
private void initToolbar() {
toolbar = (Toolbar) findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
}
private void initInstances() {
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.light_menu);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
AppBarLayout appBar = (AppBarLayout) findViewById(R.id.app_bar);
// remove shadow from AppBarLayout
appBar.setOutlineProvider(null);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if (navigationView != null) {
setupDrawerContent(navigationView);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
mDrawerLayout.closeDrawers();
return true;
}
});
}
}
Возможный дубликат Appcompatv7 - в панели навигации v21 не отображается значок гамбургера