简体   繁体   English

我想在 view-pager,Tabbed activity Android 中为 3 个不同的选项卡显示 3 个不同的片段

[英]I want to show 3 different fragments for 3 different tabs in view-pager ,Tabbed activity Android

I am very new to android, this time i created a view-pager tabbed activity by looking a video tutorial.我是 android 的新手,这次我通过观看视频教程创建了一个 view-pager 选项卡式活动。 the problem or the need is to show 3 different fragments if the user slides the position like tab1(shows first fragment),tab2 (shows second fragment) tab3 (shows third fragment) Now it is showing one and only fragment for all tabs如果用户滑动 tab1(显示第一个片段)、tab2(显示第二个片段)tab3(显示第三个片段)这样的位置,则问题或需要显示 3 个不同的片段现在它显示所有选项卡的一个且唯一的片段

this is my adapter class named datafragment package com.example.jaison.news;这是我的适配器类,名为datafragment package 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];
   }
}




 }

for those who did not get my point, all i need is implement the code something just like this, but i am not sure about this..对于那些不明白我的意思的人,我所需要的只是像这样实现代码,但我对此不确定..

        switch (position) {
            case 0:

                //showing first fragment


            case 1: 

                    //showing second fragment


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

change your getItem method like this像这样更改您的 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;
}

You need to create an instance of your viewPagerAdapter and then add items to it.您需要创建 viewPagerAdapter 的实例,然后向其中添加项目。 Something like this:像这样:

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

And the custom code for the viewpager Adapter is: viewpager 适配器的自定义代码是:

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

Also since you are new to programming, would advice you to use proper nomenclature, for eg.另外,由于您是编程新手,因此建议您使用正确的命名法,例如。 names of classes always begin with initial letter Uppercase类名总是以首字母大写开头

class ClassName 

void methodName

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 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 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.

See this simple complete example: Here I used TabLayout also which is often used with ViewPager, so will be useful for you on next.请看这个简单的完整示例:这里我还使用了 TabLayout,它通常与 ViewPager 一起使用,因此接下来对您很有用。

It requires API:它需要 API:

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

You can ignore and remove all parts of TabLayout from xml and java files if want to go simpler at this instance.如果想在此实例中变得更简单,您可以忽略并从 xml 和 java 文件中删除 TabLayout 的所有部分。

1. activity_main.xml 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. Fragment Tab1.xml 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. Fragment Tab2.xml 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. Fragment Tab3.xml 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 5.主要活动.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. Fragment class Tab1.java public class Tab1 extends Fragment { 6.片段类Tab1.java public class Tab1 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.tab1,container,false);
}
}

7. Fragment class Tab2.java 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. Fragment class Tab3.java 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. Adapter class VPAdapter.java 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;
}
}

Use this:用这个:

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

then set it like this:然后这样设置:

ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);

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

hope it helps!!!希望能帮助到你!!!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM