Показать и скрыть фрагмент в деятельности - PullRequest
0 голосов
/ 15 января 2019

В настоящее время я создаю функциональность для изменения Fragments с помощью нижней навигации. Но вместо того, чтобы уничтожать их и создавать заново, я хочу просто скрыть и показать фрагменты, чтобы сохранить переменные-члены.

Я пробовал replace(), hide() и show(), но не справился с этим правильно, я получаю ошибки анимации, которые я не могу отследить.

Я также не могу найти пример переключения фрагментов внутри AppCompatActivity.

public class MainActivity extends AppCompatActivity {

    PassengerFragment passengerFragment;
    DriverFragment driverFragment;

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

        BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
        bottomNav.setOnNavigationItemSelectedListener(navListener);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                new PassengerFragment()).commit();
    }

    // this handles the bottom navigation so when you click an item it changes fragment
    private BottomNavigationView.OnNavigationItemSelectedListener navListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                    Fragment selectedFragment = null;

                    switch (menuItem.getItemId()) {
                        case R.id.nav_passenger:
                            selectedFragment = passengerFragment;
                            break;

                        case R.id.nav_driver:
                            if (driverFragment==null) {
                                selectedFragment = new DriverFragment();
                            }
                            else {
                                selectedFragment = driverFragment;
                            }

                            break;
                    }

                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                            selectedFragment).commit(); <---- line 54

                    return true;
                }
            };
}

ERROR

Java.lang.NullPointerException: попытка вызвать виртуальный метод «java.lang.Class java.lang.Object.getClass ()» для ссылки на пустой объект на android.support.v4.app.BackStackRecord.doAddOp (BackStackRecord.java:396) на android.support.v4.app.BackStackRecord.replace (BackStackRecord.java:444) на android.support.v4.app.BackStackRecord.replace (BackStackRecord.java:434) at je.digital.kevin_pickmeup.MainActivity $ 1.onNavigationItemSelected (MainActivity.java:54)

Ответы [ 2 ]

0 голосов
/ 17 января 2019

просто нужно лучше, если операторы обрабатывают все случаи.

    private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                Fragment passengerFragment = getSupportFragmentManager().findFragmentByTag("A");
                Fragment driverFragment = getSupportFragmentManager().findFragmentByTag("B");

                switch (menuItem.getItemId()) {
                    case R.id.nav_passenger:
                        if(passengerFragment.isHidden()) {
                            getSupportFragmentManager().beginTransaction().show(passengerFragment).commit();
                            getSupportFragmentManager().beginTransaction().hide(driverFragment).commit();
                        }
                        break;

                    case R.id.nav_driver:
                        if(driverFragment==null) {
                            getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new DriverFragment(),"B").commit();
                            getSupportFragmentManager().beginTransaction().hide(passengerFragment).commit();
                        }
                        else {
                            if(driverFragment.isHidden()) {
                                getSupportFragmentManager().beginTransaction().show(driverFragment).commit();
                                getSupportFragmentManager().beginTransaction().hide(passengerFragment).commit();
                            }
                        }
                        break;
                }
                return true;
            }
};
0 голосов
/ 15 января 2019

Это потому, что вы пытаетесь заменить Fragment на null. Вы создали passengerFragment и driverFragment как поля или глобальные переменные, и чем вы пытаетесь их использовать, но в некоторых случаях особенно passengerFragment равно null. Если вы пытаетесь сохранить данные в Fragments, даже если они будут заменены, вы можете использовать addToBackStack, но вам нужно будет уметь не помещать слишком много в стек, вероятно, проверяя getSupportFragmentManager().getBackStackEntryCount() и удаляя, если их больше 1 используя popBackStack() или сохраните данные в Bundle в onDestroyView и восстановите эти данные в onCreateView:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...