BottomNavigationView et Navgraph
Bonjour à tous !
Je débute sous Android, et je suis actuellement en stage pour faire une application mobile d'espace client, hélas les devs de la boîte ne connaissent pas Android et je me retrouve un peu livrée à moi-même pour ce qui relève spécifiquement d'Android.
Voilà donc mon souci :
- J'ai une MainActivity "HomeActivity" qui possède une toolbar en haut et une bottomnavigationview en bas.
Sur la bottomnavigationview, il y a 5 icones :
- Accueil
- Assistance
- Contrats
- Factures
- Compte
Le login est dans une activité à part donc lorsqu'on arrive sur la "home" activity, on arrive sur le fragment "Accueil".
Sur mon Navgraph, pour la section qui me pose problème la navigation se fait de la façon suivante :
accueil -> Compte ->Contacts
compte est un nested graph, contact en est un autre.
Quand je veux accéder aux contacts depuis le compte, par l'action "simple", aucun problème, tout fonctionne nickel, l'icone "compte" de la bottomnavview est selectionnée quand je suis dans les contacts,et absolument tout le reste de ma navigation fonctionne aussi SAUF :
- J'ai un lien vers "contacts" dans ma page d'accueil. J'ai essayé de le faire avec une global action mais j'ai une erreur :
Code:
1 2 3
| E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp, PID: 16697
java.lang.IllegalArgumentException: navigation destination com.example.myapp:id/action_global_contacts is unknown to this NavController |
De plus, mon bouton popback fonctionne, même pour les pop personnalisés (par exemple faire back au milieu d'une étape de modification renverrai au fragment racine) mais pas mon bouton PopUp, il ne reagit pas aux clicks, c'est comme s'il n'existait pas.
Je vous mets le code de ma home activity :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class HomeActivity extends AppCompatActivity {
@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));
setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setTitle(null);
//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 navController = Navigation.findNavController(this, R.id.fragmentContainer);
NavigationUI.setupWithNavController(bView, navController);
NavigationUI.setupActionBarWithNavController(this, navController);
} |
Mon navgraph :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
| <?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/navgraph_bottomview"
app:startDestination="@id/mnuHome">
<fragment
android:id="@id/mnuHome"
android:name="com.example.myapp.Fragments.Home.Home"
android:label="fragment_home"
tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_mnuHome_to_accountMain"
app:destination="@id/mnuAccount"
/>
<action
android:id="@+id/action_mnuHome_to_mnuBills"
app:destination="@id/mnuBills" />
<action
android:id="@+id/action_mnuHome_to_mnuContracts"
app:destination="@id/mnuContracts" />
<action
android:id="@+id/action_mnuHome_to_mnuHelp"
app:destination="@id/mnuHelp" />
</fragment>
<fragment
android:id="@id/mnuBills"
android:name="com.example.myapp.Fragments.Bills.BillsMain"
android:label="fragment_bills_main"
tools:layout="@layout/fragment_bills_main" />
<fragment
android:id="@id/mnuContracts"
android:name="com.example.myapp.Fragments.Contracts.ContractsMain"
android:label="fragment_contracts_main"
tools:layout="@layout/fragment_contracts_main" />
<navigation
android:id="@id/mnuHelp"
app:startDestination="@id/mnuHelp" >
<fragment
android:id="@id/mnuHelp"
android:name="com.example.myapp.Fragments.Help.Help"
android:label="fragment_help"
tools:layout="@layout/fragment_help">
<action
android:id="@+id/action_mnuHelp_to_helpStep2"
app:destination="@id/helpStep2" />
<action
android:id="@+id/action_mnuHelp_to_supportHistory"
app:destination="@id/supportHistory" />
</fragment>
<fragment
android:id="@+id/helpStep2"
android:name="com.example.myapp.Fragments.Help.HelpStep2"
android:label="fragment_help_step2"
tools:layout="@layout/fragment_help_step2">
<action
android:id="@+id/action_helpStep2_to_helpStep3A"
app:destination="@id/helpStep3A" />
<action
android:id="@+id/action_helpStep2_to_helpStep3B"
app:destination="@id/helpStep3B" />
<action
android:id="@+id/action_helpStep2_to_supportHistory"
app:destination="@id/supportHistory"
app:popUpTo="@id/mnuHelp" />
</fragment>
<fragment
android:id="@+id/helpStep3B"
android:name="com.example.myapp.Fragments.Help.HelpStep3B"
android:label="fragment_help_step3_b"
tools:layout="@layout/fragment_help_step3_b" >
<action
android:id="@+id/action_helpStep3B_to_mnuHelp"
app:destination="@id/mnuHelp"
app:popUpTo="@id/mnuHelp" />
</fragment>
<fragment
android:id="@+id/helpStep3A"
android:name="com.example.myapp.Fragments.Help.HelpStep3A"
android:label="fragment_help_step3"
tools:layout="@layout/fragment_help_step3" >
<action
android:id="@+id/action_helpStep3A_to_helpStep4A"
app:destination="@id/helpStep4A" />
</fragment>
<fragment
android:id="@+id/supportHistory"
android:name="com.example.myapp.Fragments.Help.SupportHistory"
android:label="fragment_support_history"
tools:layout="@layout/fragment_support_history" >
<action
android:id="@+id/action_supportHistory_to_mnuHelp"
app:destination="@id/mnuHelp" />
</fragment>
<fragment
android:id="@+id/helpStep4A"
android:name="com.example.myapp.Fragments.Help.HelpStep4A"
android:label="fragment_help_step4a"
tools:layout="@layout/fragment_help_step4a" >
<action
android:id="@+id/action_helpStep4A_to_mnuHelp"
app:destination="@id/mnuHelp" />
<action
android:id="@+id/action_helpStep4A_to_helpStep5A"
app:destination="@id/helpStep5A" />
</fragment>
<fragment
android:id="@+id/helpStep5A"
android:name="com.example.myapp.Fragments.Help.HelpStep5A"
android:label="fragment_help_step5"
tools:layout="@layout/fragment_help_step5" >
<action
android:id="@+id/action_helpStep5A_to_mnuHelp"
app:destination="@id/mnuHelp"
app:popUpTo="@id/mnuHelp" />
</fragment>
</navigation>
<navigation
android:id="@id/mnuAccount"
app:startDestination="@id/mnuAccount" >
<fragment
android:id="@id/mnuAccount"
android:name="com.example.myapp.Fragments.Account.AccountMain"
android:label="fragment_account_main"
tools:layout="@layout/fragment_account_main">
<action
android:id="@+id/action_mnuAccount_to_accountAboutUs"
app:destination="@id/accountAboutUs" />
<action
android:id="@+id/action_mnuAccount_to_accountChangePassword"
app:destination="@id/accountChangePassword" />
<action
android:id="@+id/action_mnuAccount_to_accountEditInformations"
app:destination="@id/accountEditInformations" />
</fragment>
<navigation
android:id="@id/contacts"
app:startDestination="@id/contactsList">
<fragment
android:id="@+id/contactDisplayOne"
android:name="com.example.myapp.Fragments.Account.ContactDisplayOne"
android:label="fragment_contact_display_one"
tools:layout="@layout/fragment_contact_display_one">
<action
android:id="@+id/action_contactDisplayOne_to_contactEditOne"
app:destination="@id/contactEditOne" />
</fragment>
<fragment
android:id="@+id/contactAddOne"
android:name="com.example.myapp.Fragments.Account.ContactAddOne"
android:label="fragment_contact_add_one"
tools:layout="@layout/fragment_contact_add_one" >
<action
android:id="@+id/action_contactAddOne_to_contactsList"
app:destination="@id/contactsList"
app:popUpTo="@+id/contactsList" />
</fragment>
<fragment
android:id="@+id/contactsList"
android:name="com.example.myapp.Fragments.Account.ContactsList"
android:label="fragment_account_watchcontacts"
tools:layout="@layout/fragment_account_watchcontacts">
<action
android:id="@+id/action_contactsList_to_contactAddOne"
app:destination="@id/contactAddOne"
app:popUpTo="@+id/contacts" />
<action
android:id="@+id/action_contactsList_to_contactEditOne"
app:destination="@id/contactEditOne" />
<action
android:id="@+id/action_contactsList_to_contactDisplayOne"
app:destination="@id/contactDisplayOne" />
</fragment>
<fragment
android:id="@+id/contactEditOne"
android:name="com.example.myapp.Fragments.Account.ContactEditOne"
android:label="fragment_contact_edit_one"
tools:layout="@layout/fragment_contact_edit_one">
<action
android:id="@+id/action_contactEditOne_to_contactsList"
app:destination="@id/contactsList"
app:popUpTo="@+id/contactsList" />
</fragment>
</navigation>
<fragment
android:id="@+id/accountAboutUs"
android:name="com.example.myapp.Fragments.Account.AccountAboutUs"
android:label="fragment_account_about_us"
tools:layout="@layout/fragment_account_about_us" />
<fragment
android:id="@+id/accountChangePassword"
android:name="com.example.myapp.Fragments.Account.AccountChangePassword"
android:label="fragment_account_change_password"
tools:layout="@layout/fragment_account_change_password" />
<fragment
android:id="@+id/accountEditInformations"
android:name="com.example.myapp.Fragments.Account.AccountEditInformations"
android:label="fragment_account_edit_informations"
tools:layout="@layout/fragment_account_edit_informations" >
<action
android:id="@+id/action_accountEditInformations_to_mnuAccount"
app:destination="@id/mnuAccount"
app:popUpTo="@id/mnuAccount" />
</fragment>
<action
android:id="@+id/action_global_contacts"
app:destination="@id/contacts" />
</navigation>
</navigation> |
Et le layout de mon activity avec le navhost fragment :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <?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_below="@id/toolbar"
android:layout_marginTop="0dp"
android:layout_marginBottom="0dp"
android:scrollbarStyle="insideOverlay"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph = "@navigation/navgraph_bottomview"
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> |
Le xml de ma bottomnavigationview :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?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> |
Voilà n'hésitez pas à me dire si vous avez besoin de code supplémentaire ou quoi, et pardon d'avance pour les trucs qui paraîtraient aberrants, je navigue entre les tutos depuis la mi-octobre pour arriver à m'en sortir ^^° Mais on trouve tout et n'importe quoi et entre les trucs deprecated et les trucs pas fiables c'est dur de s'y retrouver.
Merci d'avance :)