汉堡包图标不适用于导航架构组件
Hamburger icon not working for Navigation Architecture Components
所以我使用了 java 的导航架构组件,尽管我遵循了使用 kotlin 的代码实验室。
我的代码正在运行,但我发现了一些问题:
1.汉堡包图标可见但不起作用。从左侧滑动屏幕显示导航抽屉。
2. fragments的后退按钮也不起作用
我认为这是工具栏的问题,但我不这么认为,因为我有一个可以正常工作的溢出菜单。
请问如何解决这些问题?我非常接近解决这个问题,但我被卡住了。
下面是代码。
package com.disruption.globalmail;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import java.util.HashSet;
import java.util.Set;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private AppBarConfiguration mAppBarConfiguration;
public static String mRequestUrl = "url here";
private DrawerLayout mDrawerLayout;
private NavController mNavController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
assert actionBar != null;
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_launcher_background);
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.my_nav_host_fragment);
assert navHostFragment != null;
mNavController = navHostFragment.getNavController();
Set<Integer> topLevelDests = new HashSet<>();
topLevelDests.add(R.id.top_news_dest);
topLevelDests.add(R.id.duplicate_top_news_dest);
mDrawerLayout = findViewById(R.id.drawer_layout);
mAppBarConfiguration = new AppBarConfiguration.Builder(topLevelDests)
.setDrawerLayout(mDrawerLayout)
.build();
setupActionBar(mNavController);
setupNavigationMenu(mNavController);
}
private void setupNavigationMenu(NavController navController) {
NavigationView navigationView = findViewById(R.id.nav_view);
NavigationUI.setupWithNavController(navigationView, navController);
}
private void setupActionBar(NavController navController) {
// This allows NavigationUI to decide what label to show in the action bar
// By using appBarConfig, it will also determine whether to
// show the up arrow or drawer menu icon
NavigationUI.setupActionBarWithNavController(this, navController, mDrawerLayout);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return NavigationUI.onNavDestinationSelected(item, mNavController)
|| super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
和下面的布局
<?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"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:background="?attr/colorPrimary"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay"
android:layout_height="wrap_content" />
<fragment
android:id="@+id/my_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/news_nav_graph" />
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/menu_nav_drawer" />
</android.support.v4.widget.DrawerLayout>
试试这个:
package com.disruption.globalmail;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import java.util.HashSet;
import java.util.Set;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;
import androidx.navigation.ui.AppBarConfiguration;
// I'm not sure that you want to use only NavigationUI for
// some of those methods. Try using these instead.
import androidx.navigation.ui.NavigationUI.navigateUp
import androidx.navigation.ui.onNavDestinationSelected
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private AppBarConfiguration mAppBarConfiguration;
public static String mRequestUrl = "url here";
private DrawerLayout mDrawerLayout;
private NavController mNavController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
assert actionBar != null;
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_launcher_background);
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.my_nav_host_fragment);
assert navHostFragment != null;
mNavController = navHostFragment.getNavController();
Set<Integer> topLevelDests = new HashSet<>();
topLevelDests.add(R.id.top_news_dest);
topLevelDests.add(R.id.duplicate_top_news_dest);
mDrawerLayout = findViewById(R.id.drawer_layout);
mAppBarConfiguration = new AppBarConfiguration.Builder(topLevelDests)
.setDrawerLayout(mDrawerLayout)
.build();
setupActionBar(mNavController);
setupNavigationMenu(mNavController);
}
private void setupNavigationMenu(NavController navController) {
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setupWithNavController(navController);
}
private void setupActionBar(NavController navController) {
// This allows NavigationUI to decide what label to show in the action bar
// By using appBarConfig, it will also determine whether to
// show the up arrow or drawer menu icon
setupActionBarWithNavController(navController, mDrawerLayout);
}
// This might just fix your issue by itself.
@Override
public boolean onSupportNavigateUp() {
return navigateUp(mNavController, mDrawerLayout)
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return item.onNavDestinationSelected(mNavController)
|| super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
您的问题可能是使用了错误的导航方法进行设置,但我认为这个添加可能会为您解决问题,而无需更改这些方法:
@Override
public boolean onSupportNavigateUp() {
return navigateUp(mNavController, mDrawerLayout)
}
我还没有尝试覆盖 onCreateOptionsMenu,所以我不确定您是否正确地这样做了。否则,你绝对是在正确的轨道上。
所以我使用了 java 的导航架构组件,尽管我遵循了使用 kotlin 的代码实验室。 我的代码正在运行,但我发现了一些问题: 1.汉堡包图标可见但不起作用。从左侧滑动屏幕显示导航抽屉。 2. fragments的后退按钮也不起作用
我认为这是工具栏的问题,但我不这么认为,因为我有一个可以正常工作的溢出菜单。
请问如何解决这些问题?我非常接近解决这个问题,但我被卡住了。
下面是代码。
package com.disruption.globalmail;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import java.util.HashSet;
import java.util.Set;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private AppBarConfiguration mAppBarConfiguration;
public static String mRequestUrl = "url here";
private DrawerLayout mDrawerLayout;
private NavController mNavController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
assert actionBar != null;
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_launcher_background);
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.my_nav_host_fragment);
assert navHostFragment != null;
mNavController = navHostFragment.getNavController();
Set<Integer> topLevelDests = new HashSet<>();
topLevelDests.add(R.id.top_news_dest);
topLevelDests.add(R.id.duplicate_top_news_dest);
mDrawerLayout = findViewById(R.id.drawer_layout);
mAppBarConfiguration = new AppBarConfiguration.Builder(topLevelDests)
.setDrawerLayout(mDrawerLayout)
.build();
setupActionBar(mNavController);
setupNavigationMenu(mNavController);
}
private void setupNavigationMenu(NavController navController) {
NavigationView navigationView = findViewById(R.id.nav_view);
NavigationUI.setupWithNavController(navigationView, navController);
}
private void setupActionBar(NavController navController) {
// This allows NavigationUI to decide what label to show in the action bar
// By using appBarConfig, it will also determine whether to
// show the up arrow or drawer menu icon
NavigationUI.setupActionBarWithNavController(this, navController, mDrawerLayout);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return NavigationUI.onNavDestinationSelected(item, mNavController)
|| super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
和下面的布局
<?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"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:background="?attr/colorPrimary"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay"
android:layout_height="wrap_content" />
<fragment
android:id="@+id/my_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/news_nav_graph" />
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/menu_nav_drawer" />
</android.support.v4.widget.DrawerLayout>
试试这个:
package com.disruption.globalmail;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import java.util.HashSet;
import java.util.Set;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;
import androidx.navigation.ui.AppBarConfiguration;
// I'm not sure that you want to use only NavigationUI for
// some of those methods. Try using these instead.
import androidx.navigation.ui.NavigationUI.navigateUp
import androidx.navigation.ui.onNavDestinationSelected
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private AppBarConfiguration mAppBarConfiguration;
public static String mRequestUrl = "url here";
private DrawerLayout mDrawerLayout;
private NavController mNavController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
assert actionBar != null;
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_launcher_background);
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.my_nav_host_fragment);
assert navHostFragment != null;
mNavController = navHostFragment.getNavController();
Set<Integer> topLevelDests = new HashSet<>();
topLevelDests.add(R.id.top_news_dest);
topLevelDests.add(R.id.duplicate_top_news_dest);
mDrawerLayout = findViewById(R.id.drawer_layout);
mAppBarConfiguration = new AppBarConfiguration.Builder(topLevelDests)
.setDrawerLayout(mDrawerLayout)
.build();
setupActionBar(mNavController);
setupNavigationMenu(mNavController);
}
private void setupNavigationMenu(NavController navController) {
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setupWithNavController(navController);
}
private void setupActionBar(NavController navController) {
// This allows NavigationUI to decide what label to show in the action bar
// By using appBarConfig, it will also determine whether to
// show the up arrow or drawer menu icon
setupActionBarWithNavController(navController, mDrawerLayout);
}
// This might just fix your issue by itself.
@Override
public boolean onSupportNavigateUp() {
return navigateUp(mNavController, mDrawerLayout)
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return item.onNavDestinationSelected(mNavController)
|| super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
您的问题可能是使用了错误的导航方法进行设置,但我认为这个添加可能会为您解决问题,而无需更改这些方法:
@Override
public boolean onSupportNavigateUp() {
return navigateUp(mNavController, mDrawerLayout)
}
我还没有尝试覆盖 onCreateOptionsMenu,所以我不确定您是否正确地这样做了。否则,你绝对是在正确的轨道上。