Android BottomNavigationView и NavController проблема с selectedItem (Java) - PullRequest
1 голос
/ 25 октября 2019

У меня есть MainActivity с BottomNavigationView и 5 элементами меню, каждый из которых ссылается на фрагмент (дом, справка, контракты, счета, счет)

на фрагменте Home, есть ссылка для6-й «контактный» фрагмент, который не является элементом нижней навигационной панели. В настоящее время, когда я нажимаю на эту ссылку, она отображает фрагмент «контакта», как и предполагалось, НО на bottomNavBar, значок «home» по-прежнему отмечен. Мне бы хотелось, чтобы вместо этого был отмечен значок «учетная запись», поскольку фрагмент «контакт» принадлежит разделу «учетная запись» (доступ к нему можно получить через учетную запись> просмотреть контакты)

Я перемещаюсь с помощью navcontroller / navigationUIВот код для моего Home_Fragment:

package com.example.myapp.Fragments;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.Navigation;
import androidx.navigation.fragment.NavHostFragment;
import com.example.techcrea.HelpfulTools.UserModel;
import com.example.techcrea.R;

/**
 * A simple {@link Fragment} subclass.
 */
public class Home extends Fragment implements View.OnClickListener {
    //VIEW ATTRIBUTES ##############################################################################
    /**
     * The text that displays our username
     */
    private TextView displayUserName;
    /**
     * The horizontal dividers
     */
    private View divider1, divider2, divider3, divider4, divider5;

    /**
     * The small icons left of each row
     */
    private ImageView iconBills, iconAccount, iconContracts,iconContacts;

    /**
     * The pics for each type of contract
     */
    private ImageView imgFiber, imgPhone, imgOther;

    /**
     * Clickable lines
     */
    private LinearLayout accountRow, billRow, contractsRow, contactsRow, helpBlock;

   //DATA ATTRIBUTES ##############################################################################
    private UserModel user;


    /***
     * Fragment sole constructor
     */
    public Home() {
        // Required empty public constructor
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

     //Here we set the text that displays the user name
     View view = inflater.inflate(R.layout.fragment_home, container, false);

     loadViewComponents(view);
     user= ViewModelProviders.of(this).get(UserModel.class);
     displayUserName.setText(user.getUser().getValue().getUserName());


     return view;

    }


    /**
     * Binds the design components to variables
     */
    public void loadViewComponents(View view){
        displayUserName = view.findViewById(R.id.txtWelcomeUser);
        divider1 = view.findViewById(R.id.dvd1);
        divider2 = view.findViewById(R.id.dvd2);
        divider3 = view.findViewById(R.id.dvd3);
        divider4 = view.findViewById(R.id.dvd4);
        divider5 = view.findViewById(R.id.dvd5);
        iconBills = view.findViewById(R.id.iconBills);
        iconAccount = view.findViewById(R.id.iconAccount);
        iconContracts = view.findViewById(R.id.iconContracts);
        iconContacts = view.findViewById(R.id.iconContacts);
        imgFiber = view.findViewById(R.id.img_fiber);
        imgPhone = view.findViewById(R.id.img_phone);
        imgOther = view.findViewById(R.id.img_other);
        accountRow = view.findViewById(R.id.row_account);
        billRow = view.findViewById(R.id.row_bills);
        contractsRow = view.findViewById(R.id.row_contracts);
        contactsRow = view.findViewById(R.id.row_contact);
        helpBlock = view.findViewById(R.id.row_help);
        setListeners();
     }


    /**
     * The onClick Listeners for the menu rows.
     */
     public void setListeners(){
        accountRow.setOnClickListener(this);
        billRow.setOnClickListener(this);
        helpBlock.setOnClickListener(this);
        contactsRow.setOnClickListener(this);
        contractsRow.setOnClickListener(this);
    }

    /**
     * this method redirects the user in the belonging section, depending on which row he clicked
     * @param v the source of the click
     */
    @Override
    public void onClick(View v) {

      if (v.equals(accountRow)) {
            NavHostFragment.findNavController(this).navigate(R.id.action_mnuHome_to_mnuAccount);
        } else if (v.equals(billRow)) {
            Navigation.findNavController(v).navigate(R.id.action_mnuHome_to_mnuBills);
        } else if (v.equals(helpBlock)) {
            Navigation.findNavController(v).navigate(R.id.action_mnuHome_to_mnuHelp);
        } else if (v.equals(contactsRow)) {
          Navigation.setViewNavController();
            NavHostFragment.findNavController(this).navigate(R.id.action_global_contactsList);
        } else if (v.equals(contractsRow)) {
            Navigation.findNavController(v).navigate(R.id.action_mnuHome_to_mnuContracts);
        }
    }}

это мой макет mainActivity с навигационной панелью в нем:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Activities.HomeActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:backgroundTint="@color/toolbar_color"
        app:logo="@drawable/login_logo"
        app:titleMargins="5dp"
        android:paddingStart="10dp"
        android:paddingEnd="10dp" />


    <fragment
        android:id="@+id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/bottom_navigation"
        android:layout_below="@id/toolbar"
        android:layout_marginTop="0dp"
        android:layout_marginBottom="0dp"
        android:scrollbarStyle="insideOverlay"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/botnavigation"
        app:defaultNavHost="true">
    </fragment>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        app:itemBackground="@color/navbar_background_color"
        app:itemIconTint="@color/navbar_colors"
        app:itemTextColor="@color/navbar_colors"
        app:menu="@menu/navbar"/>

</RelativeLayout>

А это моя навигационная панель снизу:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/mnuHome"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/home" />
    <item
        android:id="@+id/mnuHelp"
        android:icon="@drawable/icon_help"
        android:title="@string/help" />
    <item
        android:id="@+id/mnuContracts"
        android:icon="@drawable/icon_contracts"
        android:title="@string/contracts" />
    <item
        android:id="@+id/mnuBills"
        android:icon="@drawable/icon_bill"
        android:title="@string/bills" />
    <item
        android:id="@+id/mnuAccount"
        android:icon="@drawable/icon_account"
        android:title="@string/account" />
</menu>

И, наконец, мой navgraph:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/botnavigation"
    app:startDestination="@id/mnuHome">
    <fragment
        android:id="@+id/mnuHome"
        android:name="com.example.techcrea.Fragments.Home"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/action_mnuHome_to_mnuContracts"
            app:destination="@id/mnuContracts" />
        <action
            android:id="@+id/action_mnuHome_to_mnuHelp"
            app:destination="@id/mnuHelp" />
        <action
            android:id="@+id/action_mnuHome_to_mnuAccount"
            app:destination="@id/mnuAccount" />
        <action
            android:id="@+id/action_mnuHome_to_mnuBills"
            app:destination="@id/mnuBills" />
    </fragment>
    <fragment
        android:id="@+id/mnuAccount"
        android:name="com.example.techcrea.Fragments.AccountMain"
        android:label="fragment_account_main"
        tools:layout="@layout/fragment_account_main" />
    <fragment
        android:id="@+id/mnuBills"
        android:name="com.example.techcrea.Fragments.BillsMain"
        android:label="fragment_bills_main"
        tools:layout="@layout/fragment_bills_main" />
    <fragment
        android:id="@+id/mnuHelp"
        android:name="com.example.techcrea.Fragments.Help"
        android:label="fragment_help"
        tools:layout="@layout/fragment_help" />
    <fragment
        android:id="@+id/contactsList"
        android:name="com.example.techcrea.Fragments.ContactsList"
        android:label="fragment_account_watchcontacts"
        tools:layout="@layout/fragment_account_watchcontacts" />
    <fragment
        android:id="@+id/mnuContracts"
        android:name="com.example.techcrea.Fragments.ContractsMain"
        android:label="fragment_contracts_main"
        tools:layout="@layout/fragment_contracts_main" /><action android:id="@+id/action_global_contactsList" app:destination="@id/contactsList"/>
</navigation>

И MainActivity, где я объявляю свой navcontroller:


//Default Android needs

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;

import com.example.techcrea.HelpfulTools.UserModel;
import com.example.techcrea.R;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.LabelVisibilityMode;

//Fragments
//Android libraries
//Our fragments
//Bottom botnavigation bar
//Toolbar


/**
 * This is the "home" activity and it contains all the fragments we will navigate in.
 * This activity is called by the LoginActivity.
 * @author Caroline
 */
public class HomeActivity extends AppCompatActivity {

    /**
     * Persistent user
     */
    private UserModel user;
    private NavController navController;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //Android default code, do not touch _______________________________________________________
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        //__________________________________________________________________________________________

        //Toolbar instanciation
        Toolbar toolbar = findViewById(R.id.toolbar);
        toolbar.setBackgroundColor(getResources().getColor(R.color.toolbar_color));
        toolbar.setTitle("");
        setSupportActionBar(toolbar);

        //Bottom Navigation : selected item by default at activity launch
        BottomNavigationView bView = findViewById(R.id.bottom_navigation); //Bottom botnavigation bar
        bView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); //This line is to force the display of texts under nav icons. Otherwise, only the active icon has its label visible.

        //Making it reactive to in-fragment links
        //We add the fragment container layout to our botnavigation controller so it observes botnavigation.
        // To change the way the navController interacts with layout, please see Res>Navigation>Nav_graph.xml
        navController = Navigation.findNavController(this,R.id.fragmentContainer);
        NavigationUI.setupWithNavController(bView, navController);
        NavigationUI.setupActionBarWithNavController(this,navController);

        }
}


Пожалуйста, будьте снисходительны, если вы видите вопиющие ошибки, я новичокв dev, и это моя первая "профессиональная" работа, я начал ее только несколько дней назад. И я француз, поэтому мой английский немного отстой, но мне пришлось писать комментарии на английском для моего экзамена. У меня не будет временизавершить это приложение до окончания моей стажировки, поэтому я стараюсь сделать его более понятным для стажера, идущего за мной.

Большое спасибо <3 </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...