2015-10-14 2 views
4

У меня есть приложение с активностью и вложенный Fragment внутри него.Установка нового фрагмента поверх активности не работает с onConfiguration change

Добавление вложенных Fragment работало нормально, когда я был заблокирован ориентацией деятельности на портрет.
Тогда я хотел обработать некоторые вещи onConfiguration изменен, поэтому я удалил ориентацию экрана из манифеста, и я заблокировал активность программно, и я переопределил 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

Nope setfragment work, но когда я хочу добавить другой фрагмент, его макет не отображается – Tony

+0

Без кода, не уверен, похоже ли это на http://stackoverflow.com/questions/30671291/why-does-rotation-cause-android-fragment -replacement-to-fail – mattm

ответ

1

вызов setRetainInstance (истина); в OnActivityCreated Callback в фрагменте.

+0

Я пробовал это в onCreate, я проверю, работает ли это Спасибо – Tony

+0

Спасибо, что он работает, даже если я изменил всю структуру кода, потому что я не получил ответа, но я протестировал его по старому коду, и он работает – Tony

+0

Спасибо, он отлично работает ... :) –

 Смежные вопросы

  • Нет связанных вопросов^_^