因此,尽管我遵循使用kotlin的代码实验室,但我将导航体系结构组件与java一起使用。 我的代码正在运行,但是我检测到一些问题: 1.汉堡图标可见,但不起作用。从左侧滑动屏幕将显示导航抽屉。 2.片段的后退按钮也不起作用。
我认为这是工具栏的问题,但我认为不是,因为我有一个可以正常工作的溢出菜单。
请问如何解决这些问题?我很想弄清楚这一点,但我被困住了。
下面是代码。
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>
答案 0 :(得分:2)
尝试一下:
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,所以我不确定您是否正确执行了此操作。否则,您肯定在正确的轨道上。