Java Android:ViewPager只显示第一个片段,其他页面为空白

Java Android:ViewPager只显示第一个片段,其他页面为空白,java,android,android-layout,android-fragments,android-viewpager,Java,Android,Android Layout,Android Fragments,Android Viewpager,我有一个ViewPager,它将一系列FoodItem显示为片段。那部分很好用 现在,我想有一个功能,如果用户点击一个按钮,他们可以查看更多关于该FoodItem的信息 为此,我想用另一个片段替换单击的片段。我修改了这个代码以符合我的目的。它起作用了——当我点击按钮时,它会替换那个特定的片段。但它只显示一个片段并对其起作用。其他片段完全是空白的 以下是我的适配器和片段: public class SectionsPagerAdapter extends FragmentStatePagerAda

我有一个ViewPager,它将一系列FoodItem显示为片段。那部分很好用

现在,我想有一个功能,如果用户点击一个按钮,他们可以查看更多关于该FoodItem的信息

为此,我想用另一个片段替换单击的片段。我修改了这个代码以符合我的目的。它起作用了——当我点击按钮时,它会替换那个特定的片段。但它只显示一个片段并对其起作用。其他片段完全是空白的

以下是我的适配器和片段:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<FoodItem> items;

public SectionsPagerAdapter(FragmentManager fm, ArrayList<FoodItem> items) {
    super(fm);
    this.items = items;
}

@Override
public Fragment getItem(int position) {
    System.out.println("PRINT: POS " + position);
    RootFragment f = new RootFragment();
    return f.newInstance(position);


}

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


public class PlaceholderFragment extends Fragment{

    private final String ARG_SECTION_NUMBER = "section_number";


    public PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        System.out.println("PRINT: INSTANCE" + sectionNumber);
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_card_layout, container, false);
        singleItem = items.get(getArguments().getInt(ARG_SECTION_NUMBER));

        // populate views here

        //Below is the button for replacing the Fragment with another Fragment.

        Button testMore = (Button) view.findViewById(R.id.testMore);
        testMore.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction trans = getFragmentManager()
                        .beginTransaction();
                                trans.replace(R.id.root_frame, new MoreInfoFragment().newInstance(getArguments().
                        getInt(ARG_SECTION_NUMBER)));
                trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                trans.addToBackStack(null);

                trans.commit();
            }
        });

        return view;
    }

}

public class MoreInfoFragment extends Fragment {

    private final String ARG_SECTION_NUMBER = "section_number";


    public MoreInfoFragment newInstance(int sectionNumber) {
        MoreInfoFragment fragment = new MoreInfoFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public MoreInfoFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.more_info_layout, container, false);
        singleItem = items.get(getArguments().getInt(ARG_SECTION_NUMBER));

        //populate views here

        return view;

    }
}

public class RootFragment extends Fragment {

    private static final String TAG = "RootFragment";
    private final String ARG_SECTION_NUMBER = "section_number";

    public RootFragment newInstance(int sectionNumber) {
        RootFragment fragment = new RootFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

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

       FragmentTransaction transaction = getFragmentManager()
                .beginTransaction();

      transaction.replace(R.id.root_frame, new PlaceholderFragment().newInstance(getArguments().
        getInt(ARG_SECTION_NUMBER)));

        System.out.println("PRINT: ROOT" + getArguments().getInt(ARG_SECTION_NUMBER));


        transaction.commit();

        return view;
    }

}
}
公共类节SpagerAdapter扩展了FragmentStatePagerAdapter{
私有ArrayList项;
公共部分SpagerAdapter(FragmentManager格式,ArrayList项){
超级(fm);
这个项目=项目;
}
@凌驾
公共片段getItem(int位置){
系统输出打印项次(“打印:位置”+位置);
RootFragment f=新的RootFragment();
返回f.newInstance(位置);
}
@凌驾
public int getCount(){
返回items.size();
}
公共类占位符片段扩展了片段{
专用最终字符串ARG\u SECTION\u NUMBER=“SECTION\u NUMBER”;
公共占位符片段newInstance(int sectionNumber){
占位符片段=新占位符片段();
System.out.println(“打印:实例”+节号);
Bundle args=新Bundle();
参数Putin(参数段号,段号);
fragment.setArguments(args);
返回片段;
}
公共占位符片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u card\u布局,容器,假);
singleItem=items.get(getArguments().getInt(ARG_SECTION_NUMBER));
//在此处填充视图
//下面是用另一个片段替换片段的按钮。
Button testMore=(Button)view.findviewbyd(R.id.testMore);
testMore.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
FragmentTransaction=getFragmentManager()
.beginTransaction();
trans.replace(R.id.root_)frame,new MoreInfoFragment().newInstance(getArguments()。
getInt(ARG_段编号));
trans.setTransition(FragmentTransaction.transition\u FRAGMENT\u OPEN);
trans.addToBackStack(空);
trans.commit();
}
});
返回视图;
}
}
公共类MoreInfoFragment扩展了片段{
专用最终字符串ARG\u SECTION\u NUMBER=“SECTION\u NUMBER”;
公共MoreInfoFragment新实例(int sectionNumber){
MoreInfoFragment=新的MoreInfoFragment();
Bundle args=新Bundle();
参数Putin(参数段号,段号);
fragment.setArguments(args);
返回片段;
}
公共信息片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.more\u info\u布局,容器,false);
singleItem=items.get(getArguments().getInt(ARG_SECTION_NUMBER));
//在此处填充视图
返回视图;
}
}
公共类RootFragment扩展了片段{
私有静态最终字符串TAG=“RootFragment”;
专用最终字符串ARG\u SECTION\u NUMBER=“SECTION\u NUMBER”;
公共根片段newInstance(int sectionNumber){
RootFragment=新的RootFragment();
Bundle args=新Bundle();
参数Putin(参数段号,段号);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.root\u碎片,容器,假);
FragmentTransaction事务=getFragmentManager()
.beginTransaction();
transaction.replace(R.id.root_框架,新占位符片段().newInstance(getArguments())。
getInt(ARG_段编号));
System.out.println(“PRINT:ROOT”+getArguments().getInt(ARG_SECTION_NUMBER));
commit();
返回视图;
}
}
}
以下是我的主要活动:

private ViewPager mViewPager;
private static ArrayList<FoodItem> sample;
private PagerContainer mContainer;


public CardLayout(){

}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
    setContentView(R.layout.activity_card_layout);

   //Sample array
    sample = new ArrayList<>();
    sample.add(new FoodItem("French Fries", "Super delicious and crispy!"))
    sample.add(new FoodItem("Burger", "Made with real Krabby Patty"))
    sample.add(new FoodItem("Pickles", "So green")) // This is the only one that displays

   //PagerContainer is a FrameLayout that has a ViewPager as a child. 
   //I want my ViewPager to display edges of the previous and next part so    
   //PagerContainer is used for that purpose.
    mContainer = (PagerContainer) findViewById(R.id.pager_container);

    mViewPager = (ViewPager) findViewById(R.id.viewPager);

   // This is to adjust the viewpager according to size of screen 
    mContainer.getViewTreeObserver().
            addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @SuppressLint("NewApi")
                @SuppressWarnings("deprecation")
                @Override
                public void onGlobalLayout() {
                    height = mContainer.getHeight();

                    double heightSize =  height * 0.8;
                    height = (int) heightSize;
                    double widthSize = height*0.6;
                    width = (int) widthSize;


                    mViewPager.setLayoutParams(new FrameLayout.LayoutParams(width, height, Gravity.CENTER));
                    mViewPager.setPageMargin(width /30);


                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN)
                        mContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    else
                        mContainer.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                }
            });

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), sample);
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setOffscreenPageLimit(mSectionsPagerAdapter.getCount());


    mViewPager.setClipChildren(false);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
        }
    });

}
private ViewPager mviewpage;
私有静态数组列表样本;
专用页面容器mContainer;
公共卡布局(){
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG\u BLUR\u BEHIND);
setContentView(R.layout.activity\u card\u布局);
//样本阵列
示例=新的ArrayList();
样本。添加(新食品(“炸薯条”,“超级美味脆!”)
样本。添加(新食品(“汉堡”,“用真正的克拉比肉饼制作”))
add(new FoodItem(“Pickles”,“So green”)//这是唯一显示的
//PagerContainer是一种框架布局,它的子级是ViewPager。
//我希望我的ViewPager显示上一部分和下一部分的边缘,以便
//PagerContainer用于此目的。
mContainer=(PagerContainer)findviewbyd(R.id.pager\u容器);
mViewPager=(ViewPager)findViewById(R.id.ViewPager);
//这是根据屏幕大小调整viewpager
mContainer.getViewTreeObserver()。
addOnGlobalLayoutListener(新建ViewTreeObserver.OnGlobalLayoutListener()){
@SuppressLint(“新API”)
@抑制警告(“弃用”)
@凌驾
公共图书馆{
height=mContainer.getHeight();
双倍高度尺寸=高度*0.8;
 @Override
    public Fragment getItem(int position) {
        // if the position is 0 we are returning the First tab
        if (position == 0) 
        {
            Fragment tab1 = new PlaceholderFragment ();
            return tab1;

        } else if (position == 1)           
        {
            Fragment tab2 = new MoreInfoFragment ();
            return tab2;

        } else if (position == 2) {

            Fragment tab3 = new RootFragment ();
            return tab3;

        } 

    }