2015-10-14 24 views
4

我有应用程序的活动和嵌套Fragment里面。在活动之上设置新片段不适用onConfiguration更改

添加嵌套Fragment工作正常,当我被关的活动方向为纵向。
后来我想处理一些事情onConfiguration改变,所以我从清单中删除屏幕方向,并以编程方式锁定了活动,我overrided onConfiguration在我的活动变化。

但在这种情况下,我尝试在活动的顶部设置Fragment

onCreateView的调用,但它不会出现在屏幕上。

我检查了这里描述的解决方案,但它没有奏效。 link

这是我的代码替换片段

protected void setFragment(Fragment fragment) { 

    FragmentManager fragmentManager = getSupportFragmentManager(); 

    FragmentTransaction fragmentTransaction; 
    fragmentTransaction = 
      fragmentManager.beginTransaction(); 

    fragmentTransaction.isAddToBackStackAllowed(); 

    fragmentTransaction.replace(R.id.container, fragment); 
    // fragmentTransaction.addToBackStack("frag1"); 

    fragmentTransaction.commit(); 
} 

protected void addFragment(Fragment fragment) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = 
      fragmentManager.beginTransaction(); 
    fragmentTransaction.setCustomAnimations(R.anim.right_in, R.anim.defff, R.anim.defff, R.anim.right_out); 
    fragmentTransaction.isAddToBackStackAllowed(); 
    fragmentTransaction.add(R.id.container, fragment); 
    fragmentTransaction.addToBackStack("frag2"); 
    fragmentTransaction.commit(); 
} 

和onConfiguration变化

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    RTA.setLocale(getApplicationContext(), RTA.getSharePrefrenceLocale(getApplicationContext())); 
    //System.out.println("device rotated");getWindowManager().getDefaultDisplay().getRotation(); 


    if (getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_270) { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     Intent Madinti = new Intent(this, Madinati.class); 
     Madinti.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     Madinti.putExtra("side", 1); 


     getApplicationContext().startActivity(Madinti); 
    } else if (getWindowManager().getDefaultDisplay().getRotation() == Surface.ROTATION_90) { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     Intent Madinti = new Intent(this, Madinati.class); 
     Madinti.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     Madinti.putExtra("side", 0); 


     getApplicationContext().startActivity(Madinti); 
    } else { 

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 

    } 
} 

,并在清单

<activity 
     android:name=".Parking.click_add" 
     android:configChanges="orientation|keyboardHidden|screenSize|locale" 
     android:label="@string/title_activity_click_add" 
     /> 

活动,这里是的onCreate和onAttach第二次添加片段

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    if (mRetainedChildFragmentManager != null) { 
     //restore the last retained child fragment manager to the new 
     //created fragment 
     try { 
      Field childFMField = Fragment.class.getDeclaredField("mChildFragmentManager"); 
      childFMField.setAccessible(true); 
      childFMField.set(this, mRetainedChildFragmentManager); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     mRetainedChildFragmentManager = getChildFragmentManager(); 
    } 
} 

任何帮助,感谢

+0

你是否在stacktrace上得到任何异常? –

+0

都能跟得上setfragment工作,但是当我想补充另一个片段其布局犯规出现 – Tony

+0

没有代码,不知道这是否是类似于http://stackoverflow.com/questions/30671291/why-does-rotation-cause-android-fragment -replacement-to-fail – mattm

回答

1

呼叫setRetainInstance(真);在片段中的OnActivityCreated回调中。

+0

我试过这在onCreate我会检查它是否工作谢谢 – Tony

+0

感谢男人它的工作,即使我改变了所有的代码结构,因为我没有得到答案,但我测试它在旧代码上,它的工作原理 – Tony

+0

感谢它的工作原理... :) –