Mik*_*kel 5 android android-fragments android-viewpager actionbarsherlock android-nested-fragment
我有一个使用ActionBarSherlock的应用程序,在主片段中我有一个ViewPager,它使用几个片段来显示列表的不同对象.
主要片段:
public class CollectionDemoFragment extends SherlockFragment {
DemoCollectionPagerAdapter mDemoCollectionPagerAdapter;
ViewPager mViewPager;
public CollectionDemoFragment() {
setTitle(R.string.title);
setHasOptionsMenu(true);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.demo_fragment, container, false);
mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mDemoCollectionPagerAdapter);
return view;
}
@Override
public void onPause() {
//This runs when the fragment goes to backstack
super.onPause();
}
@Override
public void onResume() {
//This runs when the fragment returns from backstack
super.onResume();
}
}
Run Code Online (Sandbox Code Playgroud)
ViewPagerAdapter:
public class DemoCollectionPagerAdapter extends
FragmentStatePagerAdapter {
public DemoCollectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment = new DemoObjectFragment();
Bundle args = new Bundle();
args.putInt(DemoObjectFragment.ARG_OBJECT, i + 1);
fragment.setArguments(args);
return fragment;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public int getCount() {
return 100;
}
@Override
public CharSequence getPageTitle(int position) {
return "OBJECT " + (position + 1);
}
}
Run Code Online (Sandbox Code Playgroud)
在每个片段中,我可以创建一个新的Main片段,其中包含一个要在ViewPager中显示的新列表,并用这个新片段替换内容.
ViewPager碎片:
public static class DemoObjectFragment extends Fragment {
public static final String ARG_OBJECT = "object";
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(
R.layout.fragment_collection_object, container, false);
Bundle args = getArguments();
((TextView) rootView.findViewById(android.R.id.text1)).setText(
Integer.toString(args.getInt(ARG_OBJECT)));
//Setup components
return rootView;
}
@Override
public void setMenuVisibility(final boolean visible) {
if (visible) {
//Do something
}
super.setMenuVisibility(visible);
}
@Override
public void onPause() {
//This should run when the fragment goes to backstack
super.onPause();
}
@Override
public void onResume() {
//This should run when the fragment returns from backstack
super.onResume();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.someComponent:
Fragment newContent = new CollectionDemoFragment();
switchContent(newContent, true);
break;
}
}
public void switchContent(Fragment newContent, boolean addToBackStack) {
if (newContent != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
ft.replace(R.id.content_frame, newContent);
if (addToBackStack) {
ft.addToBackStack("" + newContent.getId());
}
ft.commit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,直到我按回来,前一个主片段从backstack返回.
屏幕为空(因为onCreateView未被调用,布局不会膨胀),当主片段进入backstack时,也不会在返回时调用ViewPager中片段的生命周期方法.在ViewPager的片段中调用的唯一方法是setMenuVisibility(),因此只运行其中的代码.
任何人都知道解决这个问题的方法以及为什么会这样?
不确定是否重要,但我必须支持Android 2.3.
小智 17
在创建视图适配器时必须将片段子管理器作为参数传递 - getChildFragmentManager()
而不是getFragmentManager()
.
代替,
mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getFragmentManager());
Run Code Online (Sandbox Code Playgroud)
你应该用,
mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2914 次 |
最近记录: |