从选项卡 3 返回时片段消失
fragment disappear when came back from tab 3
我有一个 Activity,带有包含片段的 ViewPager。
第一个片段(书)在单击按钮时创建一个嵌套片段(单本书)。
问题是当我从 fragment3 回来时,第一个 fragment 及其组件都不见了。我认为它与 onSaveState 或 onDestroy 有关。
我已经尝试覆盖 onDestroy 并在父片段(书)上使用 childFragmentManager,但它不会添加到返回堆栈。
MainActivity.java :
public class MainActivity extends FragmentActivity {
ViewPager viewPager;
MyPagerAdapter adapter;
public FragmentManager fragmentManager = getSupportFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tl_tabs);
viewPager = (ViewPager) findViewById(R.id.vp_12);
Fragment[] fragments = new Fragment[3];
fragments[0] = new Book();
fragments[1] = new Search();
fragments[2] = new Study();
adapter = new MyPagerAdapter(fragmentManager, fragments);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
}
class MyPagerAdapter extends FragmentStatePagerAdapter {
private Fragment[] fragments;
public MyPagerAdapter(FragmentManager fm, Fragment[] fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return fragments[0];
case 1:
return fragments[1];
case 2:
return fragments[2];
default:
return fragments[0];
}
}
@Override
public int getCount() {
return fragments.length;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "단어장";
case 1:
return "단어 검색";
case 2:
return "내 정보";
default:
return "";
}
}
}
Book.java :
public class Book extends Fragment {
FragmentManager fragmentManager;
private Button btn;
private EditText editText;
public Book() {
// Required empty public constructor
}
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_book, container, false);
btn = (Button) view.findViewById(R.id.btn_toQuiz);
editText =(EditText) view.findViewById(R.id.edit_text);
ViewPager viewPager = (ViewPager) container;
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentManager = getChildFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.fl_BookContainer,new singleBook(),"TAG")
.addToBackStack(null)
.commit();
}
});
return view;
}
}
默认情况下,FragmentStatePagerAdapter 只能创建两个片段,当您转到第三个片段时,它将删除第一个片段。因此解决方案是您需要调用 setOffscreenPageLimit 方法保存在将适配器设置为视图寻呼机时添加到寻呼机适配器中的所有片段。
Fragment[] fragments = new Fragment[3];
fragments[0] = new Book();
fragments[1] = new Search();
fragments[2] = new Study();
adapter = new MyPagerAdapter(fragmentManager, fragments);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(fragments.size());
tabLayout.setupWithViewPager(viewPager);
viewPager = (ViewPager) findViewById(R.id.vp_12);
adapter = new MyPagerAdapter(fragmentManager, fragments);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
至
viewPager = (ViewPager) findViewById(R.id.vp_12);
viewPager.setOffscreenPageLimit(3);
adapter = new MyPagerAdapter(getChildFragmentManager(), fragments);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
我有一个 Activity,带有包含片段的 ViewPager。 第一个片段(书)在单击按钮时创建一个嵌套片段(单本书)。 问题是当我从 fragment3 回来时,第一个 fragment 及其组件都不见了。我认为它与 onSaveState 或 onDestroy 有关。
我已经尝试覆盖 onDestroy 并在父片段(书)上使用 childFragmentManager,但它不会添加到返回堆栈。
MainActivity.java :
public class MainActivity extends FragmentActivity {
ViewPager viewPager;
MyPagerAdapter adapter;
public FragmentManager fragmentManager = getSupportFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tl_tabs);
viewPager = (ViewPager) findViewById(R.id.vp_12);
Fragment[] fragments = new Fragment[3];
fragments[0] = new Book();
fragments[1] = new Search();
fragments[2] = new Study();
adapter = new MyPagerAdapter(fragmentManager, fragments);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
}
class MyPagerAdapter extends FragmentStatePagerAdapter {
private Fragment[] fragments;
public MyPagerAdapter(FragmentManager fm, Fragment[] fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return fragments[0];
case 1:
return fragments[1];
case 2:
return fragments[2];
default:
return fragments[0];
}
}
@Override
public int getCount() {
return fragments.length;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "단어장";
case 1:
return "단어 검색";
case 2:
return "내 정보";
default:
return "";
}
}
}
Book.java :
public class Book extends Fragment {
FragmentManager fragmentManager;
private Button btn;
private EditText editText;
public Book() {
// Required empty public constructor
}
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_book, container, false);
btn = (Button) view.findViewById(R.id.btn_toQuiz);
editText =(EditText) view.findViewById(R.id.edit_text);
ViewPager viewPager = (ViewPager) container;
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentManager = getChildFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.fl_BookContainer,new singleBook(),"TAG")
.addToBackStack(null)
.commit();
}
});
return view;
}
}
默认情况下,FragmentStatePagerAdapter 只能创建两个片段,当您转到第三个片段时,它将删除第一个片段。因此解决方案是您需要调用 setOffscreenPageLimit 方法保存在将适配器设置为视图寻呼机时添加到寻呼机适配器中的所有片段。
Fragment[] fragments = new Fragment[3];
fragments[0] = new Book();
fragments[1] = new Search();
fragments[2] = new Study();
adapter = new MyPagerAdapter(fragmentManager, fragments);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(fragments.size());
tabLayout.setupWithViewPager(viewPager);
viewPager = (ViewPager) findViewById(R.id.vp_12);
adapter = new MyPagerAdapter(fragmentManager, fragments);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
至
viewPager = (ViewPager) findViewById(R.id.vp_12);
viewPager.setOffscreenPageLimit(3);
adapter = new MyPagerAdapter(getChildFragmentManager(), fragments);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);