Я любитель Android разработки. Я начал работать с макетом Drawer
и хочу динамически заполнять навигационные ссылки ящика (из переменной JSON, скажем, vtxJSON
). Все ссылки будут вести на один и тот же Fragment
(скажем, R.id.nav_fragment
) с отдельным Bundles
, который будет передаваться для каждой ссылки на один и тот же фрагмент.
До сих пор я создал Menu
и успешно направил ссылки на Fragment
R.id.nav_fragment
(с очень благодарной помощью из этого StackOverflow ответа). Теперь я хочу передавать набор значений (желательно в Bundles
) при каждом щелчке и обрабатывать их в классе Fragment и его классе View Model.
RE: Я использую библиотеки androidx.
Мой код такой (MainActivity. java):
Set<Integer> topLevelDestinations = new HashSet<>();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
final Menu menu = navigationView.getMenu();
menu.add(R.id.act_drawer_group, R.id.nav_home, 0, "HOME");
topLevelDestinations.add(R.id.nav_home);
int menulen= vtxJSON.length();
for(int i=0; i< menulen; i++)
{
try {
JSONObject ttxobj= (JSONObject) vtxJSON.get(i);
Bundle args = new Bundle(); // Set args to pass to the fragment
args.putString("vtx_name", (String) ttxobj.get("name"));
args.putString("vtx_mail", (String) ttxobj.get("mail"));
menu.add(R.id.act_drawer_group, R.id.nav_fragment, i+1, (String) ttaxobj.get("name"));
topLevelDestinations.add(R.id.nav_fragment);
} catch (JSONException e) {
e.printStackTrace();
}
}
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
AppBarConfiguration pxAppBar = new AppBarConfiguration.Builder(topLevelDestinations).setDrawerLayout(drawer).build();
NavigationUI.setupActionBarWithNavController((AppCompatActivity) this, navController, pxAppBar);
NavigationUI.setupWithNavController(navigationView, navController);
mobile_menu. 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"
app:startDestination="@+id/nav_home">
<fragment
android:id="@+id/nav_home"
android:name="com.mysite.myapp.ui.home.HomeFragment"
android:label="@string/menu_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/nav_fragment"
android:name="com.mysite.myapp.ui.tax.VTaxFragment"
tools:layout="@layout/fragment_vtax" />
</navigation>
VTaxFragment. java
public class VTaxFragment extends Fragment {
private VtaxViewModel vtaxViewModel;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_taxonomy, container, false);
final TextView textView = root.findViewById(R.id.text_taxonomy);
vtaxViewModel= ViewModelProviders.of(this).get(VtaxViewModel.class);
vtaxViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root;
}
}
Пожалуйста, дайте мне знать хотя бы, на правильном ли я пути. Намек или ответ были бы замечательными. Спасибо.