Как перейти к другому фрагменту из фрагмента вкладки, созданного с помощью пейджера представления - PullRequest
0 голосов
/ 31 октября 2018

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

 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;
    }
}

1 Ответ

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

Вы можете найти AndroidViewModel использования в этом случае.

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

Если у вас есть AndroidViewModel, прикрепленный к жизненному циклу активности, вы можете наблюдать это состояние в своей активности и совершать транзакции в 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);

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

...