【问题标题】:Swipe tabs in dynamic fragment在动态片段中滑动标签
【发布时间】:2019-04-27 13:58:51
【问题描述】:

我想在动态生成的片段中实现滑动标签(它没有布局文件),但我不知道如何。我已经尝试了一些东西,达到了一些“结果”,我的意思是它向我显示了选项卡布局,但它不会“加载”片段。我怀疑问题出在声明中的视图寻呼机上。这是片段的代码:

public class fg_tabs extends Fragment {

LinearLayout root;

TabLayout tab_layout;
ViewPager view_pager;
PagerAdapter pager_adaper;

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


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

    root = new LinearLayout(getActivity());
    root.setOrientation(LinearLayout.VERTICAL);

    tab_layout = new TabLayout(getActivity());
    view_pager = new ViewPager(getActivity());
    view_pager.setCurrentItem(2);

    tab_layout.addTab(tab_layout.newTab().setText("Penguins"));
    tab_layout.addTab(tab_layout.newTab().setText("North Wind"));
    tab_layout.addTab(tab_layout.newTab().setText("Dr Octavious Brine"));


    tab_layout.setTabGravity(Gravity.FILL);
    pager_adaper = new PagerAdapter(getFragmentManager(),tab_layout.getTabCount());

    view_pager.setAdapter(pager_adaper);
    view_pager.setOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab_layout));

    tab_layout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            view_pager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    root.addView(tab_layout);
    return root;
}

}

你可能想看看我怎么称呼这个片段,看看那里有没有问题:

    fg_tabs tabs = new fg_tabs();
    FragmentManager fm= getSupportFragmentManager();
    fm.beginTransaction().replace(R.id.layout_frame,tabs).commit();

寻呼机适配器类:

公共类 PagerAdapter 扩展 FragmentStatePagerAdapter { 诠释n;

public PagerAdapter(FragmentManager fm,int n) {
    super(fm);
    this.n=n;
}


@Override
public Fragment getItem(int position) {
    if(position == 0)
        return new Penguins();

    if(position == 1)
        return new NorthWind();

    if(position == 2)
        return new DrOctaviousBrine();

    return null;
}

@Override
public int getCount() {
    return n;
}

}

【问题讨论】:

    标签: android android-fragments dynamic swipe


    【解决方案1】:

    我想你忘了将ViewPager 添加到onCreateView 的视图中:

    ViewGroup.LayoutParams params = LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT)
    root.addView(view_pager, params);
    return root;
    

    【讨论】:

    • 它不起作用,它给了我这个错误(在运行中,不是语法错误):java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.空对象引用上的 View.findViewById(int)'
    • 顺便说一句,我用过:new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) root.addView(view_pager, params);
    • 我试过了,应用程序正在运行但片段没有启动:view_pager = new ViewPager(getActivity()); ViewGroup.LayoutParams 参数 = new LinearLayout.LayoutParams(MATCH_PARENT,MATCH_PARENT); view_pager.setLayoutParams(params);
    • 该错误似乎不相关,也许您的其他片段在使用 findViewById 时遇到了问题。除此之外,我认为代码有效,对吧?
    • 嗯,同意
    【解决方案2】:

    我找到了问题的答案,问题是没有为 viewpager 设置参数,也没有给他一个 id,也没有将它添加到布局中。对于那些遇到同样问题的人,只需使用普通的滑动标签代码(https://www.youtube.com/watch?v=zcnT-3F-9JA)并记住您使用的是动态片段,因此您不能声明 xml。

    import android.graphics.Color;
    import android.os.Bundle;
    import android.support.design.widget.TabLayout;
    import android.support.v4.app.Fragment;
    import android.support.v4.view.ViewPager;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    
    public class fg_tabs extends Fragment {
    
        LinearLayout root;
        TabLayout tab_layout;
        ViewPager view_pager;
        PagerAdapter pager_adapter;
    
        public fg_tabs() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            root = new LinearLayout(getActivity());
    
            root.setOrientation(LinearLayout.VERTICAL);
            root.setBackgroundColor(Color.parseColor("#42f4e8"));
    
            tab_layout = new TabLayout(getActivity());
    
            tab_layout.addTab(tab_layout.newTab().setText("penguins"));
            tab_layout.addTab(tab_layout.newTab().setText("north wind"));
            tab_layout.addTab(tab_layout.newTab().setText("octavious brine"));
            root.addView(tab_layout);
    
            tab_layout.setTabGravity(Gravity.FILL);
    
            view_pager = new ViewPager(getActivity());
            view_pager.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.FILL_PARENT));
            view_pager.setId(View.generateViewId());
            root.addView(view_pager);
    
            pager_adapter = new PagerAdapter(getChildFragmentManager(),tab_layout.getTabCount());
    
            view_pager.setAdapter(pager_adapter);
            view_pager.setOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab_layout));
    
            tab_layout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    view_pager.setCurrentItem(tab.getPosition());
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
            return root;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多