Reputation: 223
So I have used the navigation architecture components with java although I followed the codelabds that use kotlin. My code is working but I have detected a few issues: 1. The hamburger icon is visible but does not work. Sliding the screen from the left displays the navigation drawer. 2. The back button for fragments does not work either.
I thought it is an issue with the toolbar but I do not think so because I have an overflow menu that works just fine.
How do I solve these issues, please? I am so close to figuring this out but I am stuck.
Below is the code.
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();
}
}
}
and the layout below
<?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>
Upvotes: 0
Views: 3738
Reputation: 112
Try this:
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();
}
}
}
Your problem could be using the wrong navigation methods for setup, but I think this addition might do it for you without having to change those:
@Override
public boolean onSupportNavigateUp() {
return navigateUp(mNavController, mDrawerLayout)
}
I haven't tried overriding the onCreateOptionsMenu, so I'm not sure if you are doing that correctly. Otherwise, you're definitely on the right track.
Upvotes: 4