Сохранить Backstack для нижней панели навигации Android Studio (Java) - PullRequest
0 голосов
/ 31 марта 2020

согласно моему имени, я новичок в этом, и мне нужна помощь.

Это простое приложение с одним основным действием, которое имеет нижнюю панель навигации, используемую для навигации по нескольким различным фрагментам. В основном упражнении нажатие на 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. Я довольно озадачен тем, как лучше подойти к своей проблеме и вложить фрагменты в целом.

Надеясь, что у кого-то есть какие-то советы, приемы или даже личный код для решения этой проблемы. Если бы вы могли поделиться этим, это было бы очень ценно. спасибо!

...