Как загрузить фрагмент в соответствии с его экземпляром во время выполнения, используя полиморфизм? - PullRequest
0 голосов
/ 28 января 2020

У меня есть макет вкладки с 3 элементами вкладки, каждый из которых имеет свой собственный фрагмент для загрузки во время выполнения при выборе.

MainActivity.class: Здесь вызывается LoadFragment в соответствии с положением выбранной вкладки .

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                switch (tab.getPosition()) {
                    case 0:
                        LoadFragment(new LocationFragment());
                        break;
                    case 1:
                        LoadFragment(new InformationFragment());
                        break;
                    case 2:
                        LoadFragment(new CommentsFragment());
                        break;
                }
            }

Мой вопрос: как я могу использовать оператор switch для logi c для загрузки нужного фрагмента с помощью диспетчера фрагментов? Я не хочу иметь если еще иерархию операторов.

private void LoadFragment(Fragment fragment) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        switch (*some logic here*) {

            case fragment instanceof LocationFragment:
                Log.i("MainActivity", "inside load fragment");
                ft.replace(R.id.coordinate_layout, new LocationFragment());
                break;


            case fragment instanceof InformationFragment:
                ft.replace(R.id.coordinate_layout, new InformationFragment());
                break;


            case fragment instanceof CommentsFragment:
                ft.replace(R.id.coordinate_layout, new CommentsFragment());
                break;

            ft.commit();

        }
    }

1 Ответ

0 голосов
/ 28 января 2020

Вам не нужно создавать экземпляры несколько раз, вы можете просто передать тип и во время загрузки вы можете решить, какой фрагмент вам нужно загрузить.

    private static final int TYPE_LOCATION=0;
    private static final int TYPE_INFO=1;
    private static final int TYPE_COMMENT=2;

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                switch (tab.getPosition()) {
                    case 0:
                        LoadFragment(TYPE_LOCATION);
                        break;
                    case 1:
                        LoadFragment(TYPE_INFO);
                        break;
                    case 2:
                        LoadFragment(TYPE_COMMENT);
                        break;
                }
            }

private void LoadFragment(int typeOfFragment) {
        Log.i("MainActivity", "inside load fragment");
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        switch (typeOfFragment) {

            case TYPE_LOCATION:   
              ft.replace(R.id.coordinate_layout, new LocationFragment());
                break;


            case TYPE_INFO:
                ft.replace(R.id.coordinate_layout, new InformationFragment());
                break;


            case TYPE_COMMENT:
                ft.replace(R.id.coordinate_layout, new CommentsFragment());
                break;

            ft.commit();

        }
    }
...