Я использую 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);
}