[英]Fragment management when the layout changes
我有一個帶有單個活動和兩個片段的應用程序。 所需的行為是(用戶交互以藍色突出顯示):
在肖像中
在風景中
我當前的解決方案是:
景觀布局
FrameLayout
ContainerRed(FrameLayout)
ContainerYellow(FrameLayout)
縱向布局
LinearLayout
ContainerRed(FrameLayout weight=1)
ContainerYellow(FrameLayout weight=1)
當用戶單擊綠色按鈕時,我進行以下交易:
這實現了正確的行為,除非您在事務處理后旋轉設備(例如,如果您是縱向的),請轉到屏幕B1,然后旋轉設備以使其橫向運行,FragmentA插槽為空。
另外,如果您在屏幕B2中並旋轉屏幕以使其縱向,則FragmentA會出現在FragmentB的背景中。
我該如何解決? 謝謝
我有一個可行的解決方案:
首先對addToBackstack(“ FOO”)使用相同的標簽;
在Activity調用的onCreate方法末尾:
Fragment fragmentB=getFragmentManager().findFragmentByTag("FRAGMENT_B_TAG");
if (fragmentB!=null){
getFragmentManager().popBackStackImmediate("FOO",
FragmentManager.POP_BACK_STACK_INCLUSIVE);
attachFragmentB(fragmentB);
}
void attachFragmentB(Fragment fragmentB){
//In portrait: Remove FragmentA, add FragmentB to containerYellow, addToBackstack("FOO")
//In landscape: add FragmentB to contanerYellow, addToBackstack("FOO")
}
沒有多種布局和后退技巧的另一種方法是在onCreate()和onBackStackChanged()中修改容器的可見性。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
if (getSupportFragmentManager().findFragmentByTag(AFragment.TAG) == null) {
Fragment fragment = new AFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.layout_left, fragment,AFragment.TAG)
.commit();
}
}
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
updateScreen();
}
});
updateScreen();
}
//called when A button's is clicked
public void onClick() {
if (getSupportFragmentManager().findFragmentByTag(BFragment.TAG) == null) {
Fragment fragment = new BFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.layout_right, fragment, BFragment.TAG)
.addToBackStack(BFragment.TAG)
.commit();
}
}
public void updateScreen(){
if (getSupportFragmentManager().findFragmentByTag(BFragment.TAG) != null){
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
findViewById(R.id.layout_right).setVisibility(View.VISIBLE);
findViewById(R.id.layout_left).setVisibility(View.VISIBLE);
}else{
findViewById(R.id.layout_right).setVisibility(View.VISIBLE);
findViewById(R.id.layout_left).setVisibility(View.GONE);
}
}else{
findViewById(R.id.layout_right).setVisibility(View.GONE);
findViewById(R.id.layout_left).setVisibility(View.VISIBLE);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.