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();
}
}
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);
}
}
この各フラグメント内に、ViewPager に表示する新しいリストを含む新しい Main フラグメントを作成し、コンテンツをこの新しいフラグメントに置き換えることができます。
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();
}
}
}
これは、押し戻して前のメイン フラグメントがバックスタックから返されるまでは正常に機能します。
画面は空です (onCreateView が呼び出されないため、レイアウトは膨張しません)、ViewPager のフラグメントからのライフサイクル メソッドは、メイン フラグメントがバックスタックに入るときも、返されるときも呼び出されません。ViewPager のフラグメントで呼び出される唯一のメソッドは setMenuVisibility() であるため、そこにあるコードのみが実行されます。
誰でもこれを修正する方法を知っていますか?なぜこれが起こるのですか?
問題があるかどうかはわかりませんが、Android 2.3 以降をサポートする必要があります。