Reputation: 591
I have followed the material guideline here but for some reason, the bottom navigation is not working for me. My app simply displays a white frame where the bottom navigation should be. What am I doing wrong? Please note that I commented out the onCreateOptionsMenu in my MainActivity.java shown below. If I uncomment this code, the items in my menu_bottom_navigation.xml
show up in the app bar menu but I want to have them show up in the bottom navigation bar.
Build.gradle
...
implementation 'com.google.android.material:material:1.1.0'
...
Menu resource:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/discover"
android:enabled="true"
android:title="@string/title_activity_discover_movies"
android:icon="@drawable/ic_search_24px"/>
<item
android:id="@+id/favorites"
android:enabled="true"
android:title="@string/title_activity_favorite_movies"
android:icon="@drawable/ic_favorite_24px" />
</menu>
Layout resource:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
tools:context=".features.movieoptions.movielist.MainActivity">
<include
layout="@layout/toolbar_discover_movies"
android:id="@+id/toolbar_movie_list" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?attr/actionBarSize"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
android:background="@color/colorPrimary"
app:itemBackground="@color/colorPrimary"
app:itemTextColor="@color/colorTextIcons"
app:menu="@menu/menu_bottom_navigation"/>
</FrameLayout>
</LinearLayout>
MainActivity.java
package edu.bu.metcs.activitylifecycle.features.movieoptions.movielist;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import edu.bu.metcs.activitylifecycle.R;
import edu.bu.metcs.activitylifecycle.features.movieoptions.movielist.discover.DiscoverFragment;
import edu.bu.metcs.activitylifecycle.features.movieoptions.movielist.favorites.FavoritesFragment;
import edu.bu.metcs.activitylifecycle.shared.FragmentUtility;
/**********************************************************************************************************************
* This activity manages the apps fragments and decides which fragment should be displayed to the user.
*
* @author mlewis
* @version June 5, 2020
*********************************************************************************************************************/
public class MainActivity extends AppCompatActivity {
// Invariant of the MovieListActivity.java class
// 1. A shareActionProvider sends an implicit intent to apps capable of handling the text/plain MIME type.
// 2. The TAG is used by the Logcat for informational purposes.
private DiscoverFragment discoverFragment;
private FavoritesFragment favoritesFragment;
private static final String TAG = MainActivity.class.getSimpleName();
/**
* protected void onCreate(Bundle savedInstanceState)
* Performs initial Activity set up.
*
* @param savedInstanceState A bundle for any saved state from prior sessions that were destroyed.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
discoverFragment = DiscoverFragment.newInstance();
favoritesFragment = FavoritesFragment.newInstance();
// Show discover fragment by default
setUpFragment(discoverFragment);
}
setUpBottomNavigation();
setUpToolbar();
}
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// super.onCreateOptionsMenu(menu);
// getMenuInflater().inflate(R.menu.menu_bottom_navigation, menu);
// return true;
// }
private void setUpFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentUtility.fragmentTransaction(fragmentManager, R.id.fragment_container, fragment);
}
private void setUpBottomNavigation() {
Log.d(TAG, "Setting bottom nav.");
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.discover:
Log.d(TAG, "discover was clicked.");
setUpFragment(discoverFragment);
return true;
case R.id.favorites:
Log.d(TAG, "favorites was clicked.");
setUpFragment(favoritesFragment);
return true;
}
return false;
}
});
}
private void setUpToolbar() {
Toolbar toolbar = findViewById(R.id.toolbar_movie_list);
setSupportActionBar(toolbar);
}
}
Please see the white section at the bottom of the screen to see the issue:
Upvotes: 0
Views: 87
Reputation: 420
As i Checked your layout. i found the mistake 1. Fragment Container(Frame layout) having wrong margin bottom 2. Need to add wight for fragment container(Frame Layout)
Corrected code as below
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
tools:context=".features.movieoptions.movielist.MainActivity">
<include
layout="@layout/toolbar_discover_movies"
android:id="@+id/toolbar_movie_list" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:itemBackground="@color/colorPrimary"
app:itemTextColor="@color/colorTextIcons"
app:menu="@menu/menu_bottom_navigation"/>
</FrameLayout>
</FrameLayout>
</LinearLayout>
Upvotes: 1