簡體   English   中英

布局更改時的片段管理

[英]Fragment management when the layout changes

我有一個帶有單個活動和兩個片段的應用程序。 所需的行為是(用戶交互以藍色突出顯示):

在肖像中

在此處輸入圖片說明

在風景中

在此處輸入圖片說明

我當前的解決方案是:

景觀布局

FrameLayout
   ContainerRed(FrameLayout)
   ContainerYellow(FrameLayout)

縱向布局

LinearLayout
   ContainerRed(FrameLayout weight=1)
   ContainerYellow(FrameLayout weight=1)

當用戶單擊綠色按鈕時,我進行以下交易:

  • 在肖像中:刪除FragmentA,將FragmentB添加到containerYellow,添加至Backstack
  • 在橫向中:將FragmentB添加到contanerYellow,然后添加到Backstack

這實現了正確的行為,除非您在事務處理后旋轉設備(例如,如果您是縱向的),請轉到屏幕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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM