jashdf123 2019-05-06 11:10 采纳率: 0%
浏览 500

TabLayout中 PlaceholderFragment 与 Adapter 到底是如何关联得? Placeholder是怎么工作得?

安卓小白,在跟着视频教程学。最近在搞一个 Tabbed Layout,我利用了最新得Android Studio中得模板直接创建得。但是创建出来得代码和视频教学中完全不一样。


首先在java文件夹下, 会自动创建出以下内容:

创建了一个ui.main文件夹:

  • PageViewModule
  • PlaceholderFragment
  • SectionsPage

外加一个常规 MainActivity 用于关联 Tabbed Layout



Layout文件:
activity_mainxml
fragment_main.xml


我跟着代码,目前能够理解 PageViewModule 就是将 Tab 和 Fragment 进行关联,然后通过 PlaceHolderFragment 进行展示,但是我无法阅读其中得代码。特别是PlaceholderFragment 和 SectionsPage 得代码,也没有办法通过 switch 来切换不同得Fragment。还请各位专家帮忙解读一下,在网上搜了很久也没有找到有关这种结构形式得解读。


SectionPagerAdapter.java

public Fragment getItem(int position) {
        // 想通过一个switch来进行Fragment切换但是失败
                // 一直显示 Fragment_main 得layout
        switch(position){
            case 0:
                return new Fragment1();
            case 1:
                return new Fragment2();
            case 2:
                return new Fragment3();
        }
        return null;

        // return PlaceholderFragment.newInstance(position + 1);
    }



PlaceholderFragment.java

private static final String ARG_SECTION_NUMBER = "section_number";
private PageViewModel pageViewModel;

     // 通过Placeholder来创建Layout
    public static PlaceholderFragment newInstance(int index) {
        PlaceholderFragment fragment = new PlaceholderFragment();

        //为什么我们这里需要一个bundle
        Bundle bundle = new Bundle();
        bundle.putInt(ARG_SECTION_NUMBER, index);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    // 在这里 onCreate 到底应该如何解读? pageViewModel到底是什么?
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pageViewModel = ViewModelProviders.of(this).get(PageViewModel.class);
        int index = 1;
        if (getArguments() != null) {
            index = getArguments().getInt(ARG_SECTION_NUMBER);
        }
        pageViewModel.setIndex(index);
    }

    @Override
    public View onCreateView(
            @NonNull LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {


        // 猜想因为这边一直都是创建 fragment1,因此只能显示一个 fragment
       // 但是到底如何切换不同得Fragment呢
        View root = inflater.inflate(R.layout.fragment1, container, false);

        final TextView textView = root.findViewById(R.id.section_label);
        pageViewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });
        return root;
    }


PageViewModel.java

private MutableLiveData<Integer> mIndex = new MutableLiveData<>();
    private LiveData<String> mText = Transformations.map(mIndex, new Function<Integer, String>() {
        @Override
        public String apply(Integer input) {
            return "Hello world from section: " + input;
        }
    });

    public void setIndex(int index) {
        mIndex.setValue(index);
    }

    public LiveData<String> getText() {
        return mText;
    }

还请各位高手帮忙解读一下,这个到底是怎么生成得Layout,为什么我的switch为什么没有用? Placeholder它到底是怎么工作得?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 08:35
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    TabLayout 是一个可以用来显示多个 Fragment 的布局管理器。PlaceholderFragment 是一个特殊的 Fragment 类型,它可以替代一个默认的 Fragment。它的作用是在 TabLayout 中提供一个临时的布局,当用户点击某个 Tab 时,会触发 Fragment 的切换。

    在你提供的代码中,PageViewModel 是一个 ViewModel 对象,它包含了一些状态信息(比如当前选中的 Fragment 的索引)。SectionPagerAdapter 是一个适配器,它负责管理和加载不同的 FragmentPlaceholderFragment 通过 PageViewModel 获取当前选中的 Fragment 的索引,并根据这个索引加载相应的 Fragment

    当你点击不同的 Tab 时,PageViewModel 会更新其内部的状态,并相应地切换到对应的 Fragment。在这种情况下,Switch 控件不会被使用,因为你可以直接通过 PageViewModel 的状态来控制 Fragment 的切换。

    PlaceholderFragment 通过 ViewPager 或者 RecyclerView 显示一些临时的内容,以代替实际的 Fragment。这样做的目的是为了提高性能,特别是在处理较大的数据集时。当用户滚动到不同的位置时,这些临时的内容会被重新渲染,从而减少不必要的网络请求。

    总的来说,TabLayoutPlaceholderFragmentSectionPagerAdapter 是 Android 布局管理系统的一部分,它们协同工作以实现高效且易于维护的应用界面设计。

    评论

报告相同问题?