Michael
Michael

Reputation: 591

Why does BottomNavigationView not get displayed?

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: enter image description here

Upvotes: 0

Views: 87

Answers (1)

Sumit Bandekar
Sumit Bandekar

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

Related Questions