Android Показать Скрыть фрагмент BottomNavigationView Первый добавленный элемент не виден - PullRequest
0 голосов
/ 12 октября 2018

У меня есть настройка из 3 фрагментов в моей основной деятельности, и я хочу перемещаться по ним с помощью BottomNavigationView.Я хочу добавить их один раз, а затем просто переключаться между ними, не уничтожая фрагменты.Все работает нормально, за исключением того, что первый фрагмент, добавленный в SupportFragmentManager, всегда исчезает (пытался изменить порядок, чтобы проблема была не в самих фрагментах).На самом деле, он не исчезает, но обнаруживается последний фрагмент, который занял контейнер.Например.Я иду в позицию 3, фрагмент 3 появляется в контейнере, а затем нажимаю на позицию 1, фрагмент 3 по-прежнему будет занимать контейнер.Но если я коснусь позиции 2, появится фрагмент 2.Как я добавляю фрагменты:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.container, fragment1); //whatever gets added here ends up being invisible
    ft.commitAllowingStateLoss();

    ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.container, fragment2);
    ft.commitAllowingStateLoss();

    ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.container, fragment3);
    ft.commitAllowingStateLoss();

Как я переключаюсь между ними с помощью OnNavigationItemSelectedListener:

private BottomNavigationView.OnNavigationItemSelectedListener navigation_listener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment selectedFragment = null;
        Fragment previousFragment = getSupportFragmentManager().findFragmentById(R.id.container);

        switch(item.getItemId()){
            case R.id.bottom_navigation_bar_position1:
                selectedFragment = fragment1;
                break;
            case R.id.bottom_navigation_bar_position2:
                selectedFragment = fragment2;
                break;
            case R.id.bottom_navigation_bar_position3:                   
                selectedFragment = fragment3;
                break;
        }

        getSupportFragmentManager().beginTransaction().hide(previousFragment).commit();
        getSupportFragmentManager().beginTransaction().show(selectedFragment).commit();

        return true;
    }
};

Навигация по меню XML:

<item
    android:id="@+id/bottom_navigation_bar_position1"
    android:title="Title1"
    android:icon="@drawable/ic1"
    />

<item
    android:id="@+id/bottom_navigation_bar_position2"
    android:title="Title2"
    android:icon="@drawable/ic2"
    />

<item
    android:id="@+id/bottom_navigation_bar_position3"
    android:title="Title3"
    android:icon="@drawable/ic3"
    />

Кстати.просто использовать replace () вместо show and hide works, но это не цель ... Я также проверил, выходит ли первый добавленный фрагмент (и не уничтожается) и он действительно существует ... Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Вместо того, чтобы пытаться показать и скрыть фрагмент, я решил проблему, управляя фрагментами, используя ViewPager и SectionsPageAdapter.После того, как вы свяжете эти два, используйте ViewPager.setOffscreenPageLimit (3), чтобы убедиться, что фрагменты не будут уничтожены.Мой BottomNavigationView.OnNavigationItemSelectedListener теперь выглядит так:

private BottomNavigationView.OnNavigationItemSelectedListener navigation_listener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        switch(item.getItemId()){
            case R.id.bottom_navigation_bar_position1:
                tab_view_pager.setCurrentItem(0);
                return true;
            case R.id.bottom_navigation_bar_position2:
                tab_view_pager.setCurrentItem(1);
                return true;
            case R.id.bottom_navigation_bar_position3:
                tab_view_pager.setCurrentItem(2);
                return true;
        }
        return false;
    }
};
0 голосов
/ 12 октября 2018

Вы должны установить 0-ую позицию позиции, выбранную для BottomNavigationView.OnNavigationItemSelectedListener.Найти Menu bottom_navigation_bar_position1
Я использовал это в своем коде, пожалуйста, рефакторинг в соответствии с вашими потребностями

BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(this);
    Menu menu = navigation.getMenu();
    this.onNavigationItemSelected(menu.findItem(R.id.navigation_doc));
...