J'ai le Activity
suivant, qui est le seul dans mon application:
MainActivity.Java :
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
PermissionState state = PermissionState.get(this);
if (state == PermissionState.GRANTED) {
getWindow().setBackgroundDrawable(new ColorDrawable(-1));
}
super.onCreate(savedInstanceState);
ActivityMainBinding mainActivityBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
setSupportActionBar(mainActivityBinding.toolbarMain);
NavigationUI.setupWithNavController(mainActivityBinding.toolbarMain, Navigation.findNavController(this, R.id.nav_Host_fragment));
}
}
La disposition associée au Activity
est la suivante et a été créée à la suite de this Android Tutorial Developers.
activity_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<com.google.Android.material.appbar.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.Android.material.appbar.AppBarLayout>
<fragment
Android:id="@+id/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/nav_graph" />
</LinearLayout>
</layout>
graphique de navigation est le suivant:
nav_graph.xml :
<?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/nav_graph"
app:startDestination="@id/mainFragment">
<fragment
Android:id="@+id/mainFragment"
Android:name="com.example.myapp.MainFragment"
Android:label="@string/app_name"
tools:layout="@layout/fragment_main">
<action
Android:id="@+id/action_mainFragment_to_settingsFragment"
app:destination="@+id/settingsFragment" />
</fragment>
<fragment
Android:id="@+id/settingsFragment"
Android:name="com.example.myapp.SettingsFragment"
Android:label="@string/settings" />
</navigation>
Maintenant, à part l'hébergement Activity
, mon application a deux Fragment
s, l'un est le principal, l'autre est pour les paramètres.
La principale Fragment
est la destination de départ de mon application, et là je voudrais récupérer la variable MainActivity " PermissionState state "pour effectuer certaines actions en fonction de l'état des autorisations, comme masquer ou afficher des View
s.
Utilisation de Android Architecture API de navigation des composants version 1.0.0-beta01
à partir de maintenant, quelle est la stratégie correcte et non spécifiée pour transmettre les données de l'hébergement Activity
à la destination de départ Fragment
, peut-être en utilisant Safe Args si possible?
Trouver une solution, fonctionne bien, mais je ne l'aime pas, il doit y avoir une meilleure solution pour cela.
Dans votre activité:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navController = findNavController(R.id.nav_controller_fragment)
val bundle = Bundle()
bundle.putString("name","your value")
navController.setGraph(navController.graph,bundle)
}
À vos débuts Fragment:
val args: MainFragmentArgs by navArgs()
textView.text = args.name
Dans votre navGraph:
<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/mobile_navigation"
app:startDestination="@id/mainFragment">
<fragment Android:id="@+id/mainFragment"
Android:name="com.haidar.mediasaver.fragments.MainFragment"
Android:label="main_fragment"
tools:layout="@layout/main_fragment">
<argument Android:name="name"
app:argType="string"/>
</fragment>
Si vous utilisez des arguments sûrs, vous devez faire:
app:navGraph
attribut de votre NavHostFragment
Appelez ensuite:
findNavController(R.id.nav_controller_fragment)
.setGraph(
R.navigation.nav_graph,
MainFragmentArgs("your values").toBundle()
)