jashdf123 2019-05-06 11:10 采纳率: 25%
浏览 499

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它到底是怎么工作得?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 永磁型步进电机PID算法
    • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
    • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
    • ¥15 如何处理复杂数据表格的除法运算
    • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥200 uniapp长期运行卡死问题解决
    • ¥15 latex怎么处理论文引理引用参考文献
    • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
    • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?