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