Как перейти к другому фрагменту из фрагмента вкладки, созданного с помощью пейджера просмотра

Я создал три вкладки с тремя фрагментами с помощью пейджера просмотра. Я хочу перейти к вдохновляющему фрагменту после щелчка по элементу списка, определенному внутри фрагмента категорий (фрагмент вкладки, созданный с помощью пейджера просмотра). Когда я нажимаю на элемент списка, возникает ошибка. Я хочу перейти к вдохновляющему фрагменту из фрагмента категорий (фрагмент определяется внутри пейджера просмотра). Категории (фрагмент вкладки, созданный с помощью пейджера просмотра)

 public class Categories extends Fragment {

    private RecyclerView recyclerView;
    private List<CategoriesDataModel> list;
    private String[] categories={"Inspiring","Feelings","Strength","Hard Work","Success"};

    public Categories() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_categories, container, false);

        recyclerView = (RecyclerView) view.findViewById(R.id.categoriesList_Id);

        list = new ArrayList<>();

        for (int i = 0; i < categories.length; i++) {
            CategoriesDataModel dataModel = new CategoriesDataModel();

            dataModel.cat_name = categories[i];

            list.add(dataModel);
        }

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setHasFixedSize(true);
        CategoryRecyclerViewAdapter adapter = new CategoryRecyclerViewAdapter(list,getContext());
        adapter.setOnItemClickListener(new CategoryRecyclerViewAdapter.ClickListener() {
            @Override
            public void onItemClick(int position, View v) {
                switch (position){
                    case 0:
                        getFragmentManager().beginTransaction().replace(R.id.frameLayout_inspiring,new Inspiring()).addToBackStack(null).commit();

                }
            }
        });
        recyclerView.setAdapter(adapter);
        return view;
    }
}

Вдохновляюще: -

public class Inspiring extends Fragment {


    public Inspiring() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.fragment_inspiring, container, false);
    }
}

Адаптер пейджера: -

public class Pager extends FragmentStatePagerAdapter {
    int tabCount=0;

    public Pager(FragmentManager fm,int tabCount) {
        super(fm);
        this.tabCount=tabCount;
    }


    //this will return tab selected
    @Override
    public Fragment getItem(int i) {
        switch(i) {
            case 0:
                return new Recents();

            case 1:
                return new Top();

            case 2:
                return new Categories();

            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return tabCount;
    }
}
0
0
47
1

Ответы 1

В этом случае вам может пригодиться AndroidViewModel.

Вы пытаетесь поддерживать состояние между различными частями вашего приложения.

Если у вас есть AndroidViewModel, прикрепленный к жизненному циклу Activity, вы можете наблюдать это состояние в своей Activity и совершать транзакции с FragmentManager, чтобы представить свой выбор.

Пример

ViewModel

Эта ViewModel содержит данные о состоянии того элемента навигации, в котором вы находитесь (в данном случае представляет собой Fragment с целым числом), и использует целое число для представления индекса для вашей строки вдохновения.

public class NavigationViewModel extends AndroidViewModel {
    private MutableLiveData<Integer> navigationLiveData = new MutableLiveData<>();
    private MutableLiveData<Integer> inspirationLiveData = new MutableLiveData<>();

    public NavigationViewModel(@NonNull Application application) {
        super(application);
    }

    public LiveData<Integer> getNavigation() {
        return navigationLiveData;
    }

    public void setNavigation(Integer id) {
        navigationLiveData.postValue(id);
    }

    public LiveData<Integer> getInspiration() {
        return inspirationLiveData;
    }

    public void setInspiration(Integer id) {
        inspirationLiveData.postValue(id);
    }
}

Деятельность

Activity будет наблюдать навигацию LiveData, предоставляемую нашей реализацией AndroidViewModel. Это сразу же сообщит ему об изменении навигации.

public class NavigationActivity extends AppCompatActivity {

    private NavigationViewModel navigationViewModel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        navigationViewModel = ViewModelProviders.of(this).get(NavigationViewModel.class);

        navigationViewModel.getNavigation().observe(this, id -> {
            switch(id) {
                case R.id.recents:
                    // TODO: Load recent fragment here with a transaction
                    break;
                case R.id.top:
                    // TODO: Load top fragment here with a transaction
                    break;
                case R.id.categories:
                    // TODO: Load categories fragment here with a transaction
                    break;
                case R.id.inspiring:
                    // TODO: Load inspiring fragment here with a transaction
                    break;
            }
        });
    }
}

Фрагмент вдохновения

Этот Fragment будет соответствовать индексу вдохновения, обеспечиваемому нашей реализацией AndroidViewModel. Это позволяет ему знать, какой контент нужно отображать. Это можно установить из В ЛЮБОМ МЕСТЕ.

public class InspiringFragment extends Fragment {

    private NavigationViewModel navigationViewModel;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_inspiring, container, false);

        navigationViewModel = ViewModelProviders.of(this).get(NavigationViewModel.class);

        navigationViewModel.getInspiration().observe(getViewLifecycleOwner(), inspiration -> {
            // TODO: Update the root view UI with data gleaned using the inspiration index given here
        });

        return root;
    }
}

Установка его

После этого все, что вам нужно сделать, это вызвать:

navigationViewModel.setInspiration(1);
navigationViewModel.setNavigation(R.id.inspiration);

Это должно дать вам хорошую основу для начала.

Другие вопросы по теме