Передайте пакет в Android (с макетом ящика) в пункт назначения (HashSet) через 'NavController' и 'AppBarConfiguration.Builder' - PullRequest
0 голосов
/ 09 июля 2020

Я любитель 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;
        }
    }

Пожалуйста, дайте мне знать хотя бы, на правильном ли я пути. Намек или ответ были бы замечательными. Спасибо.

...