согласно моему имени, я новичок в этом, и мне нужна помощь.
Это простое приложение с одним основным действием, которое имеет нижнюю панель навигации, используемую для навигации по нескольким различным фрагментам. В основном упражнении нажатие на R.id.nav_first / second в панели навигации заменяет контейнер фрагмента в основном действии на первый / второй фрагмент соответственно.
ОБСЛУЖИВАНИЕ. JAVA:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNav);
findViewById(R.id.bottomNav);bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.nav_first:
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentcontainer, new FirstFragment()).commit();
return true;
case R.id.nav_second:
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentcontainer, new SecondFragment()).commit();
return true;
}
return true;
}});
}}
ОБСЛУЖИВАНИЕ. XML:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:itemTextColor="@color/colorPrimaryDark"
app:itemIconTint="@color/colorPrimaryDark"
app:menu="@menu/nav"/>
<FrameLayout
android:id="@+id/fragmentcontainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/bottomNav"/>
Затем я добавил в FirstFragment кнопку, которая заменяет FirstFragment на InnerFragment, добавляя FirstFragment в backstack.
FIRSTFRAGMENT. JAVA
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.first_fragment, container, false);
Button button = (Button) view.findViewById(R.id.next_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentTransaction fr = getFragmentManager().beginTransaction();
fr.replace(R.id.fragmentcontainer, new InnerFragment());
fr.addToBackStack(TAG);
fr.commit();
}
});
return view;}}
Это все работает отлично. Однако из-за способа, которым кодируется mainactivity. java, когда вы находитесь в InnerFragment, нажимая R.id.nav_second, а затем снова на R.id.nav_first, вы попадете в FirstFragment, когда интуитивно, как пользователь, вы хотел бы, чтобы он вернул вас туда, где вы остановились (InnerFragment) в «стеке фрагментов».
Как я могу решить эту проблему и заставить навигационную панель «запоминать» backstack для каждой кнопки? Я понимаю, что, проводя исследование, я должен вложить дочерний фрагмент в родительский фрагмент A. Некоторые сайты говорят, что для фрагментов используется массив, а другие говорят, что нужно использовать viewpager. Я довольно озадачен тем, как лучше подойти к своей проблеме и вложить фрагменты в целом.
Надеясь, что у кого-то есть какие-то советы, приемы или даже личный код для решения этой проблемы. Если бы вы могли поделиться этим, это было бы очень ценно. спасибо!