【问题标题】:I want to show 3 different fragments for 3 different tabs in view-pager ,Tabbed activity Android我想在 view-pager 中为 3 个不同的选项卡显示 3 个不同的片段,选项卡活动 Android
【发布时间】:2021-01-22 02:52:23
【问题描述】:

我对 android 非常陌生,这次我通过查看视频教程创建了一个视图分页器选项卡式活动。如果用户像 tab1(显示第一个片段)、tab2(显示第二个片段)、tab3(显示第三个片段)这样的位置滑动,问题或需要是显示 3 个不同的片段 现在它为所有标签显示一个也是唯一的片段

这是我的适配器类,名为 datafragment 包 com.example.jaison.news;

public class datafragment extends Fragment {
View view;
ViewPager viewPager;
TabLayout tabLayout;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view= inflater.inflate(R.layout.sample,container,false);


    viewPager = (ViewPager) view.findViewById(R.id.viewpager);
    viewPager.setAdapter(new sliderAdapter(getChildFragmentManager()));
    tabLayout = (TabLayout) view.findViewById(R.id.sliding_tabs);
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });

    return view;

}




private class sliderAdapter extends FragmentPagerAdapter{

    final  String tabs[]={"tab1", "tab2","tab3"};
    public sliderAdapter(FragmentManager fm) {
        super(fm);
    }


    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;

        return fragment;
    }


    @Override
    public int getCount() {


       return 3;
    }
   @Override
   public CharSequence getPageTitle(int position) {
        return tabs[position];
   }
}




 }

对于那些不明白我的意思的人,我所需要的只是实现这样的代码,但我不确定..

        switch (position) {
            case 0:

                //showing first fragment


            case 1: 

                    //showing second fragment


            case 2:
                //showing third fragment
            default:
                return new Fragment();
        }

【问题讨论】:

  • 你能给我答案吗?
  • 你应该创建3个不同的片段xml文件和3个片段类,按照上面的链接一步一步你会得到解决方案
  • 我知道如何创建片段,下一部分对我来说有点困难。作为开关位置

标签: java android android-fragments android-viewpager android-tabbed-activity


【解决方案1】:

像这样更改您的 getItem 方法

 @Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    switch (position){
        case 0:
            fragment = new Tab1Fragment();
            break;
        case 1:
            fragment = new Tab2Fragment();
            break;
       case 2:
            fragment = new Tab3Fragment();
            break;
    }
    return fragment;
}

【讨论】:

  • 工作............其实我很新,我喜欢你的回答,它非常简单,我所需要的就是
【解决方案2】:

您需要创建 viewPagerAdapter 的实例,然后向其中添加项目。 像这样的:

ViewPagerAdapter viewpagerAdapter = new ViewPagerAdapter(getChildFragmentManager());

viewPager.setAdapter(viewpagerAdapter);

// then add items to it as you add items to a recyclerview adapter or to any list

viewpagerAdapter.addFragment(new Fragment1(), "title1");

而viewpager Adapter的自定义代码是:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

另外,由于您是编程新手,建议您使用正确的命名法,例如。类名总是以大写首字母开头

class ClassName 

void methodName

【讨论】:

    【解决方案3】:

    MainActivity

    import android.os.Bundle;
    import android.support.design.widget.TabLayout;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
    
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }
    
    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new OneFragment(), "ONE");
        adapter.addFragment(new TwoFragment(), "TWO");
        adapter.addFragment(new ThreeFragment(), "THREE");
        viewPager.setAdapter(adapter);
    }
    
    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();
    
        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }
    
        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }
    
        @Override
        public int getCount() {
            return mFragmentList.size();
        }
    
        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
    }
    

    OneFragment.java

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    
    public class OneFragment extends Fragment{
    
    public OneFragment() {
        // Required empty public constructor
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_one, container, false);
    }
    
    }
    

    fragment_one.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/one"
        android:textSize="40dp"
        android:textStyle="bold"
        android:layout_centerInParent="true"/>
    
     </RelativeLayout>
    
    Likewise create few more fragment activities with same code we used for OneFragment.java.
    

    【讨论】:

    【解决方案4】:

    请看这个简单的完整示例: 这里我使用了 TabLayout,它也经常与 ViewPager 一起使用,所以接下来会对你有用。

    需要 API:

    compile 'com.android.support:design:25.3.1'
    

    如果想在这种情况下变得更简单,您可以忽略并从 xml 和 java 文件中删除 TabLayout 的所有部分。

    1. activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/viewPager"/>
    
        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
            app:tabIndicatorColor="@color/colorPrimaryDark"
            app:layout_scrollFlags="scroll|enterAlways"
            android:id="@+id/tabLayout"/>
    
    </RelativeLayout>
    

    2。片段 Tab1.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="TAB 1"
        android:id="@+id/textTab1"/>
    
    </RelativeLayout>
    

    3.片段 Tab2.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="TAB 2"
        android:id="@+id/textTab2"/>
    
    </RelativeLayout>
    

    4.片段 Tab3.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="TAB 3"
        android:id="@+id/textSpacerNoTitleab3"/>
    
    </RelativeLayout>
    

    5. MainActivity.java

    public class MainActivity extends AppCompatActivity
        implements TabLayout.OnTabSelectedListener, ViewPager.OnPageChangeListener{
    
    ViewPager viewPager;
    TabLayout tabLayout;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    
        tabLayout.addTab(tabLayout.newTab().setText("Page 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Page 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Page 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        tabLayout.addOnTabSelectedListener(this);
    
        viewPager.setAdapter(new VPAdapter(getSupportFragmentManager()));
        viewPager.addOnPageChangeListener(this);
    }
    
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        w("onTabSelected(): "+tab.getPosition());
        viewPager.setCurrentItem(tab.getPosition());
    }
    
    @Override
    public void onTabUnselected(TabLayout.Tab tab) {
    
    }
    
    @Override
    public void onTabReselected(TabLayout.Tab tab) {
    
    }
    
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
    }
    
    @Override
    public void onPageSelected(int position) {
        w("onPageSelected(): "+position);
        TabLayout.Tab tab = tabLayout.getTabAt(position);
        if(tab!=null)tab.select();
    }
    
    @Override
    public void onPageScrollStateChanged(int state) {
    
    }
    
    void w(String string){
        Log.w("MKN",getClass().getSimpleName()+" "+string);
    }
    }
    

    6.片段类 Tab1.java 公共类 Tab1 扩展片段 {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        return inflater.inflate(R.layout.tab1,container,false);
    }
    }
    

    7.片段类 Tab2.java

    public class Tab2 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        return inflater.inflate(R.layout.tab2,container,false);
    }
    }
    

    8.片段类 Tab3.java

    public class Tab3 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        return inflater.inflate(R.layout.tab3,container,false);
    }
    }
    

    9.适配器类 VPAdapter.java

    public class VPAdapter extends FragmentPagerAdapter {
    
    public VPAdapter(FragmentManager fm) {
        super(fm);
    }
    
    @Override
    public Fragment getItem(int position) {
        if(position == 0) return new Tab1();
        if(position == 1) return new Tab2();
        if(position == 2) return new Tab3();
    
        throw new IllegalStateException("Unexpected position " + position);
    }
    
    @Override
    public int getCount() {
        return 3;
    }
    }
    

    【讨论】:

      【解决方案5】:

      使用这个:

      private void setupViewPager(ViewPager viewPager) {
              ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
              // adding the fragments here with titles
              adapter.addFragment(new OneFragment(), "ONE");
              adapter.addFragment(new TwoFragment(), "TWO");
              adapter.addFragment(new ThreeFragment(), "THREE");
              viewPager.setAdapter(adapter);
          }
      
          class ViewPagerAdapter extends FragmentPagerAdapter {
              private final List<Fragment> mFragmentList = new ArrayList<>();
              private final List<String> mFragmentTitleList = new ArrayList<>();
      
              public ViewPagerAdapter(FragmentManager manager) {
                  super(manager);
              }
      
              @Override
              public Fragment getItem(int position) {
                  return mFragmentList.get(position);
              }
      
              @Override
              public int getCount() {
                  return mFragmentList.size();
              }
      
              public void addFragment(Fragment fragment, String title) {
                  mFragmentList.add(fragment);
                  mFragmentTitleList.add(title);
              }
      
              @Override
              public CharSequence getPageTitle(int position) {
                  return mFragmentTitleList.get(position);
                  //return null;
              }
          }
      

      然后这样设置:

      ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
      setupViewPager(viewPager);
      
      tabLayout = (TabLayout) view.findViewById(R.id.sliding_tabs);
      tabLayout.setupWithViewPager(viewPager);
      

      希望对你有帮助!!!

      【讨论】:

      • 由 ViewPager 的 FragmentPagerAdapter 托管的 Fragment 实例应在 FragmentPagerAdapter.getItem() 内实例化,并且永远不应在托管它的 Activity 中实例化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多