如何从使用视图寻呼机创建的选项卡片段转移到另一个片段

Posted

技术标签:

【中文标题】如何从使用视图寻呼机创建的选项卡片段转移到另一个片段【英文标题】:How to shift to another fragment from tab fragment created using view pager 【发布时间】:2019-04-04 14:53:45 【问题描述】:

我使用视图寻呼机创建了三个带有三个片段的选项卡。单击类别片段中定义的列表项(使用视图寻呼机创建的选项卡片段)后,我想跳转到鼓舞人心的片段。当我单击列表项时发生错误。我想要从类别片段(在视图寻呼机中定义的片段)跳转到鼓舞人心的片段。 类别(使用视图分页器创建的选项卡片段)

 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】:

您可能会发现在这种情况下使用 androidViewModel

您正在做的是尝试维护应用不同部分之间的状态。

如果您有一个AndroidViewModel 附加到 Activity 生命周期,您可以在您的 Activity 中观察该状态并向FragmentManager 进行交易以代表您的选择。

一个例子

视图模型

此 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 提供的灵感索引。这让它知道需要显示哪些内容。这可以从 ANYWHERE 进行设置。

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

这应该会给你一个很好的开始。

【讨论】:

以上是关于如何从使用视图寻呼机创建的选项卡片段转移到另一个片段的主要内容,如果未能解决你的问题,请参考以下文章

切换到片段选项卡主机中的选项卡时查看寻呼机丢失其内容

重新附加时片段创建/恢复重复视图

Fragment中的ViewPager,只有选项卡才能在第一个视图上加载选项卡

从活动更新视图页面中片段中的列表视图

EditText 软键盘总是在视图寻呼机的片段上打开

Android:如何在选项卡内从一个片段导航到另一个片段? [关闭]