Назначение Неизвестно с использованием NavController и BottomNav в Android - PullRequest
0 голосов
/ 22 апреля 2020

Я использую BottomNavigationView для переключения между тремя фрагментами верхнего уровня (Карта, Список, Информация) в NavHostFragment, который, кажется, работает. NavHostFragment настроен на мою навигацию XML main_nav.

Я хочу, чтобы мой ListFragment открыл новый DetailFragment (не в меню BottomNavigationView) и передал Custom Serializable аргумент класса Mural при нажатии на одну из карточек в RecyclerView. Я делаю это, передавая действие и пакет моей навигации, используя Navigation.findnavcontroller(cardView).navigate(R.id.list_to_detail, dataToSend)

Однако, View.OnClickListener в моем MuralViewHolder вызывает IllegalArgumentException: navigation destination com.package.example:id/list_to_detail is unknown to this NavController. Тем не менее, я добавил это действие (с назначением) к своему main_nav, а также к аргументу, как показано ниже. Почему он не может найти фрагмент, к которому я хочу перейти?

Я попытался передать пункт назначения R.id.detail_fragment в качестве первого аргумента вместо действия, описанного выше, которое успешно передает данные и перемещается к месту назначения, но dr aws my fragment_detail layout поверх макета fragment_list. Как я могу заменить исходный фрагмент целевым фрагментом?

В моем MainActivity:

private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment selectedFragment = null;

        switch (item.getItemId()) {
            case R.id.bottom_nav_info:
                selectedFragment = new InfoFragment();
                break;
            case R.id.bottom_nav_map:
                selectedFragment = new MapFragment();
                break;
            case R.id.bottom_nav_list:
                selectedFragment = new ListFragment();
                break;
        }
        getSupportFragmentManager().beginTransaction().replace(R.id.nav_host, selectedFragment).commit();
        return true;
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    navController = Navigation.findNavController(this, R.id.nav_host);
    appBarConfiguration = new AppBarConfiguration.Builder(R.id.map_fragment).build();
    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);

    bottomNav = findViewById(R.id.bottom_nav);
    bottomNav.setOnNavigationItemSelectedListener(navListener);
}

В моем main_nav:

    <fragment
    android:id="@+id/list_fragment"
    android:name="com.package.example.ui.fragments.ListFragment"
    tools:layout="@layout/fragment_list" >
    <action
        android:id="@+id/list_to_detail"
        app:destination="@id/detail_fragment" />
</fragment>

<fragment
    android:id="@+id/info_fragment"
    android:name="com.package.example.ui.fragments.InfoFragment"
    tools:layout="@layout/fragment_info" />

<fragment
    android:id="@+id/map_fragment"
    android:name="com.package.example.ui.fragments.MapFragment"
    tools:layout="@layout/fragment_map" />

<fragment
    android:id="@+id/detail_fragment"
    android:name="com.package.example.ui.fragments.DetailFragment"
    tools:layout="@layout/fragment_detail">
    <argument
        android:name="mural_from_list"
        app:argType="com.package.example.model.Mural" />
</fragment>

В моем View.OnClickListener:

   @Override
            public void onClick(View view) {

                int position = getAdapterPosition();
                Bundle dataToSend = new Bundle();
                dataToSend.putSerializable("mural_from_list", allItems.get(position));
                Navigation.findNavController(view).navigate(R.id.list_to_detail, dataToSend);
            } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...