我有一个ViewPager,它将一系列FoodItem显示为片段。那部分工作正常。
现在,我希望有一个功能,如果用户点击按钮,他们可以查看有关该FoodItem的更多信息。
为此,我想用另一个片段替换点击的片段。我修改了这段代码here以符合我的目的。它工作 - 当我点击按钮,它取代了某些片段。但它只显示并适用于一个片段。其他碎片完全是空白的。
这是我的适配器和片段:
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;
}
}
}
这是我的主要活动:
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();
}
});
}
哦,显示的Fragment甚至不是我的ArrayList中的第一个!这是最后一次。
我觉得我错过了一些显而易见的东西,但我已经查看过这段代码大约10次,但我仍然找不到阻止其他页面显示的内容。
如果我滑到第二页,它是完全白色的(root_fragment的背景颜色)
这适用于之后的每个片段。
你们有什么想法/建议吗?
答案 0 :(得分:0)
在SelectionsPageAdapter
中覆盖方法getItem() @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;
}
}