safeArgs در navigation component
چهارشنبه, ۱۳ اسفند ۱۳۹۹، ۰۱:۴۰ ب.ظ
برای انتقال اطلاعات بین فرگمنت ها در navigation component دو روش وجود دارد:
1. استفاده از bundle - در این صورت bundle رو به عنوان آرگومان دوم navigate پاس می دهیم اما این روش توصیه نمی شود.
2. استفاده از safeArgs که این روش پیشنهاد میشه.
در این روش ابتدا می بایست تنظیمات زیر انجام شود:
- در فایل (build.gradle(project در قسمت dependencies کد زیر اضافه شود:
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
- در قسمت (build.gradle(module بالای صفحه پلاگین زیر اضافه گردد:
apply plugin: "androidx.navigation.safeargs"
***
نکته مهم: در ریسورس نویگیشن آرگومان ها را در مقصد تعریف کرده و حتما مقدار default value برای آن ست می کنیم تا اگر مقداری به آنها ارسال نشد کرش نکنه.
<fragment
android:id="@+id/secondFragment"
android:name="com.mimdal.na.SecondFragment"
android:label="fragment_second"
tools:layout="@layout/fragment_second">
<action
android:id="@+id/action_secondFragment_to_splashFragment"
app:destination="@id/splashFragment" />
<argument
android:name="password"
android:defaultValue=""
app:argType="string" />
<argument
android:name="name"
android:defaultValue=""
app:argType="string" />
</fragment>
کد ارسال دیتا از فرگمنت مبدا:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = edt_txt_name.getText().toString();
String password = edt_txt_password.getText().toString();
FirstFragmentDirections.ActionFirstFragmentToSecondFragment2 action =
FirstFragmentDirections.actionFirstFragmentToSecondFragment2();
action.setName(name);
action.setPassword(password);
NavController navController = Navigation.findNavController(view);
navController.navigate(action);
}
});
کد دریافت اطلاعات از فرگمنت:
txt_show.setText("name is: " +
SecondFragmentArgs.fromBundle(getArguments()).getName() + "\n" +
"password is: " +
SecondFragmentArgs.fromBundle(getArguments()).getPassword());
۹۹/۱۲/۱۳