繁体   English   中英

ANDROID:在instantiateItem方法中具有不同片段的ViewPager

[英]ANDROID: ViewPager with different Fragments in instantiateItem method

我使用ViewPager创建向左滑动的片段,现在我想在每个片段页面中插入片段。

activityMain.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    ...
    android:orientation="vertical">

    <android.support.v4.view.ViewPager
        android:id="@+id/myviewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <devlight.io.library.ntb.NavigationTabBar
        android:id="@+id/ntb_horizontal"
        app:ntb_swiped="true"/>


</android.support.design.widget.CoordinatorLayout>

这个: tab0_fragment.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:textSize="30sp"
        android:gravity="center"
        android:id="@+id/textView"
        android:layout_centerHorizontal="true"
        android:textColor="@android:color/holo_green_dark"
        android:text="Social\nFragment"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:autoLink="web"
        android:textSize="15sp"
        android:layout_marginTop="10dp"
        android:layout_centerHorizontal="true"
        android:text="androidbelieve.com"
        android:textColor="#000"
        android:layout_below="@+id/textView"
        android:textStyle="italic"/>

</RelativeLayout>

我有一个ViewPagermainActivity.java

final ViewPager viewPager = (ViewPager) findViewById(R.id.myviewpager);
viewPager.setAdapter(new PagerAdapter() {
...

...
}

我尝试通过片段布局在viewpager中打开一个屏幕。

我试试这个:

final ViewPager viewPager = (ViewPager) findViewById(R.id.myviewpager);
viewPager.setAdapter(new PagerAdapter() {
    ...
    public Object instantiateItem(final ViewGroup container, final int position) {
           if (position == 0)
           {
                final View view = LayoutInflater.from(getBaseContext()).inflate(R.layout.fragment_tab0, null, false);
                FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.myviewpager,new tab0Fragment()).commit();
                container.addView(view);
                return view;
           }
           else if (position == 1)
           ...

   } 

...
}

AND tab0Fragment.java

public class tab0Fragment extends Fragment {

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

我是机器人中的菜鸟。 怎么能纠正这个代码?


解决方案:答案不是我的答案,但这对我有很大的帮助。

根据@Mr。 Rabbit ans @Amit Upadhyay我将顶级代码更改为:

@Override
            public Object instantiateItem(final ViewGroup container, final int position) {

                if (position == 0)
                {
                    final View view = LayoutInflater.from(getBaseContext()).inflate(R.layout.fragment_tab0, null, false);
                    MyAdapter adapter = new MyAdapter(getSupportFragmentManager());
                    adapter.addFragment(new tab0Fragment(), getResources().getString(R.string.tab0));
                    container.addView(view);
                    return view;
                }
                else if (position == 1)
                {

并根据@Mr添加MyAdapter类。 兔子的答案。

希望能帮助别人。

尝试将适配器和代码分开。

MyAdapter.java

public class MyAdapter extends FragmentPagerAdapter{

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

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

创建你的碎片

FragmentOne.java

public class FragmentOne extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)    {
      View  view = inflater.inflate(R.layout.fragment_one, container, false);
        return view;
    }
}

FragmentTwo.java

public class FragmentTwo extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)    {
     View  view = inflater.inflate(R.layout.fragment_two, container, false);
        return view;
    }
}

在您的活动中设置您的viewpager。

final ViewPager viewPager = (ViewPager) findViewById(R.id.myviewpager);
    MyAdapter adapter = new MyAdapter(getSupportFragmentManager());

    // Add your fragments in adapter.
    FragmentOne fragmentOne = new FragmentOne();
    adapter.addFragment(fragmentOne, getResources().getString(R.string.fragment_one_title));

    FragmentTwo fragmentTwo = new FragmentTwo();
    adapter.addFragment(fragmentTwo, getResources().getString(R.string.fragment_two_title));

    viewPager.setAdapter(adapter);

然后最后使用ViewPager设置NavigationTabBar。

final NavigationTabBar navigationTabBar = (NavigationTabBar) findViewById(R.id.ntb_horizontal);
navigationTabBar.setViewPager(viewPager, 2);

为此,您可以创建自定义ViewPagerAdapter。 例如:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import java.util.ArrayList;

/**
 * Created by aupadhyay on 1/5/17.
 */

public class ViewPagerAdapter extends FragmentPagerAdapter {

    ArrayList<Fragment> fragments = new ArrayList<>();
    ArrayList<String> tabTitles = new ArrayList<>();

    public void addFragments(Fragment fragment, String tabTitle)
    {
        this.fragments.add(fragment);
        this.tabTitles.add(tabTitle);
    }

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

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

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

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

}

现在你可以在viewpager上设置适配器,如下所示:

final ViewPager viewPager = (ViewPager) findViewById(R.id.myviewpager);

ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPagerAdapter.addFragments(new Tab0Fragment(), "First");
        viewPagerAdapter.addFragments(new Tab1Fragment(), "Second");
        viewPagerAdapter.addFragments(new Tab2Fragment(), "Third");
        // add more if required.

viewPager.setAdapter(viewPagerAdapter);

Tab0FragmentTab1FragmentTab1Fragment是您在viewpager中添加的片段。

暂无
暂无

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

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