问题:
I'm trying to use Fragment with a ViewPager
using the FragmentPagerAdapter
. 我试图使用片段与ViewPager
使用FragmentPagerAdapter
。 What I'm looking for to achieve is to replace a fragment, positioned on the first page of the ViewPager
, with another one. 我想要实现的是将位于ViewPager
第一页上的片段替换为另一片段。
The pager is composed of two pages. 寻呼机由两页组成。 The first one is the FirstPagerFragment
, the second one is the SecondPagerFragment
. 第一个是FirstPagerFragment
,第二个是SecondPagerFragment
。 Clicking on a button of the first page. 单击第一页的按钮。 I'd like to replace the FirstPagerFragment
with the NextFragment. 我想用NextFragment替换FirstPagerFragment
。
There is my code below. 我的代码如下。
public class FragmentPagerActivity extends FragmentActivity {
static final int NUM_ITEMS = 2;
MyAdapter mAdapter;
ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
/**
* Pager Adapter
*/
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
if(position == 0) {
return FirstPageFragment.newInstance();
} else {
return SecondPageFragment.newInstance();
}
}
}
/**
* Second Page FRAGMENT
*/
public static class SecondPageFragment extends Fragment {
public static SecondPageFragment newInstance() {
SecondPageFragment f = new SecondPageFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Log.d("DEBUG", "onCreateView");
return inflater.inflate(R.layout.second, container, false);
}
}
/**
* FIRST PAGE FRAGMENT
*/
public static class FirstPageFragment extends Fragment {
Button button;
public static FirstPageFragment newInstance() {
FirstPageFragment f = new FirstPageFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Log.d("DEBUG", "onCreateView");
View root = inflater.inflate(R.layout.first, container, false);
button = (Button) root.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction trans = getFragmentManager().beginTransaction();
trans.replace(R.id.first_fragment_root_id, NextFragment.newInstance());
trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
trans.addToBackStack(null);
trans.commit();
}
});
return root;
}
/**
* Next Page FRAGMENT in the First Page
*/
public static class NextFragment extends Fragment {
public static NextFragment newInstance() {
NextFragment f = new NextFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Log.d("DEBUG", "onCreateView");
return inflater.inflate(R.layout.next, container, false);
}
}
}
...and here the xml files ...这里是xml文件
fragment_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:padding="4dip"
android:gravity="center_horizontal"
android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
</android.support.v4.view.ViewPager>
</LinearLayout>
first.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/first_fragment_root_id"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button android:id="@+id/button"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="to next"/>
</LinearLayout>
Now the problem... which ID should I use in 现在问题是......我应该使用哪个ID
trans.replace(R.id.first_fragment_root_id, NextFragment.newInstance());
? ?
If I use R.id.first_fragment_root_id
, the replacement works, but Hierarchy Viewer shows a strange behavior, as below. 如果我使用R.id.first_fragment_root_id
,则替换有效,但层次结构查看器显示奇怪的行为,如下所示。
At the beginning the situation is 一开始情况就是这样
after the replacement the situation is 更换后的情况是
As you can see there is something wrong, I expect to find the same state shown as in the first picture after I replace the fragment. 正如您所看到的那样,有一些问题,我希望在更换片段后找到与第一张图片中显示的状态相同的状态。
解决方案:
参考一: https://stackoom.com/question/WPM4参考二: Replace Fragment inside a ViewPager