編集を回転させた後viewpagerでフラグメントを保持: アプリケーションは3を保持しているViewPagerを持つ単一の活動で構成されています:私はので、ここでこれらのことを説明する時にひどいよビデオ http://sendvid.com/mefqxd8fは
コンテキストですタブ。 Tab1は、PageFragmentListenerというインターフェースを使用して、ボタンが押されたときに同じタブ内の2つの異なるフラグメント間を切り替える。アプリが最初に読み込まれると、Fragment1はTab1で膨張されます。ボタンをクリックすると、Fragment2がTab1で膨張します。私はこの後にFragment1を永久にTab1に残したいと思います。
問題: Tab3が現在アクティブ(ユーザーに表示されている)で、デバイスが回転している場合、Tab1は完全に破棄されます。再作成すると、断片2を復元する代わりに、断片1でTab1を膨張させます。ビデオでは、Tab1が紫色ではなく青色であることがわかります。
質問:Fragment1を拡張するのではなく、破損したFragment2をTab1に復元する方法はありますか?私はsavedInstanceState
何とか使用できると仮定しています。回転がスタックにフラグメントを追加するために
setRetainInstance(true);
を呼び出すことにより、以前のフラグメントを取得するには、この
transaction.addToBackStack(fragment.getClass.getName());
ようにしようとしている間のフラグメントの状態を保持する
class MyAdapter extends FragmentStatePagerAdapter {
static final String TAG = "MyAdapter";
private final FragmentManager mFragmentManager;
public BaseFragment mFragmentA;
public BaseFragment mFragmentB;
/**
* PageFragmentListener for switching fragmentA.
*/
public PageFragmentListener mListenerA = new PageFragmentListener() {
@Override
public void onSwitchToNextFragment(final String id) {
mFragmentManager.beginTransaction().remove(mFragmentA).commit();
if (mFragmentA instanceof FragmentA)
{
mFragmentA = FragmentA2.newInstance(mListenerA); // => switch fragment a2
}
else if (mFragmentA instanceof FragmentA2){
mFragmentA = FragmentA.newInstance(mListenerA);
}
notifyDataSetChanged(); // notify changes
}
};
/**
* PageFragmentListener for switching fragmentB.
*/
public PageFragmentListener mListenerB = new PageFragmentListener() {
@Override
public void onSwitchToNextFragment(final String id) {
mFragmentManager.beginTransaction().remove(mFragmentB).commit();
if (mFragmentB instanceof ItemListFragment){ // current fragment is List Fragment
Bundle arguments = new Bundle();
arguments.putString(Constants.ARG_ITEM_ID, id); // selected item id
mFragmentB = ItemOneDetailFragment.newInstance(mListenerB); // switch detail fragment
mFragmentB.setArguments(arguments);
}else if (mFragmentB instanceof ItemOneDetailFragment) { // DetailFragment
mFragmentB = ItemListFragment.newInstance(mListenerB); // => switch list fragment
}
notifyDataSetChanged(); // notify changes
}
};
public MyAdapter(FragmentManager fm) {
super(fm);
Log.d(TAG, "MyAdapterConstructor");
mFragmentManager = fm;
List<Fragment> fragments = fm.getFragments();
if(fragments != null){
for(Fragment f : fragments){
if (f instanceof FragmentA || f instanceof FragmentA2){
mFragmentA = (BaseFragment) f;
}
if(f instanceof ItemListFragment || f instanceof ItemOneDetailFragment){
mFragmentB = (BaseFragment) f;
}
}
}
}
@Override
public Fragment getItem(int position) {
Log.d(TAG, "getItem()");
if (position == 0){ // Tab-1
if (!(mFragmentA instanceof FragmentA2)) {
mFragmentA = FragmentA.newInstance(mListenerA);
}
return mFragmentA;
}
if (position == 1) // Tab-2
return FragmentB.newInstance();
if (position == 2) { // Tab-3
if (!(mFragmentB instanceof ItemOneDetailFragment)){
mFragmentB = ItemListFragment.newInstance(mListenerB);
}
return mFragmentB;
}
else{
return null;
}
}
/**
* To set tab title.
* @param position the currently visible ViewPager fragment
* @return the title of the fragment
*/
@Override
public CharSequence getPageTitle(int position) {
Log.d(TAG, "getPageTitle()");
if (position == 0) { // Tab-1
return "Tab 1";
}
if (position == 1) { // Tab-2
return "Tab 2";
}
if (position == 2) { //Tab-3
return "Tab 3";
}
return null;
}
@Override
public int getCount() { // Count of Tabs
return 3;
}
@Override
public int getItemPosition(Object object) {
Log.i("Adapter", "ItemPosition>>>" + object.toString());
if (object instanceof ItemListFragment && mFragmentB instanceof ItemOneDetailFragment) { // fragment changed
return POSITION_NONE;
}
if (object instanceof ItemOneDetailFragment && mFragmentB instanceof ItemListFragment) { // fragment changed
return POSITION_NONE;
}
if (object instanceof FragmentA && mFragmentA instanceof FragmentA2) {
return POSITION_NONE;
}
if (object instanceof FragmentA2 && mFragmentA instanceof FragmentA){
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
}
タブとフラグメントの説明がかなり混乱していますが、より明確になりますか? – sandesh
申し訳ありません。 http://sendvid.com/mefqxd8fのビデオをご覧ください。私は回転後に紫色の背景を持つフラグメントを残しておきたいが、代わりに青い背景のフラグメントがロードされる。 –