在按下后退按钮的片段中,活动为空白

Fil*_*nco 65 android android-fragments

我有一个活动和许多碎片在同一个膨胀 FrameLayout

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)

示例:mainActivity>任何片段(按后退按钮)>活动为空.

在onCreate:

layout = (FrameLayout)findViewById(R.id.content_frame);
layout.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

当我开始片段时:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, profileFragment);
ft.addToBackStack(null);
ft.commit();
layout.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)

我想我需要GONE在后退时再次使frameLayout的可见性,但我该怎么做?


我尝试onBackPressed并设置layout.setVisibility(View.GONE);但我无法通过片段返回,因为我直接进入主页.

Sam*_*mar 121

如果您在活动中使用了多个片段,或者即使您只有一个片段,那么第一个片段也不应该定义addToBackStack.由于这允许返回导航,因此在此片段之前将显示空活动布局.

 // fragmentTransaction.addToBackStack() // dont include this for your first fragment.
Run Code Online (Sandbox Code Playgroud)

但是对于另一个片段,你需要定义它,否则后面将不会导航到早期的屏幕(片段),而是应用程序可能会关闭.


Goo*_*ife 42

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    }
    else {
        int fragments = getSupportFragmentManager().getBackStackEntryCount();
        if (fragments == 1) {
            finish();
        } else if (getFragmentManager().getBackStackEntryCount() > 1) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

添加片段

 getSupportFragmentManager().beginTransaction()
                .replace(R.id.layout_main, dashboardFragment, getString(R.string.title_dashboard))
                .addToBackStack(getString(R.string.title_dashboard))
                .commit();
Run Code Online (Sandbox Code Playgroud)

  • 我再说一遍,"这应该是公认的答案" (4认同)

小智 22

回复晚了非常抱歉.

你不必添加 ft.addToBackStack(null); 同时添加第一个片段.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, profileFragment);
// ft.addToBackStack(null); --remove this line.
ft.commit();
// ... rest of code
Run Code Online (Sandbox Code Playgroud)

  • 如果我们有这个片段,我们必须打开另一个片段。如果我们单击返回顶部的一个,它将关闭它。 (2认同)

小智 20

如果你想通过片段跟踪,你应该覆盖onBackPressed方法,就像这样

public void onBackPressed() { 
   if (getFragmentManager().getBackStackEntryCount() == 1) {
        finish();
   } else {
        super.onBackPressed();
   }
}
Run Code Online (Sandbox Code Playgroud)


JRo*_*ero 14

您可以覆盖onBackPressed并检查后台堆栈上是否有任何内容.

@Override
public void onBackPressed() {
    int fragments = getFragmentManager().getBackStackEntryCount();
    if (fragments == 1) { 
        // make layout invisible since last fragment will be removed
    }
    super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果使用supportedFragmentManager添加/替换片段,则还应使用getSupportFragmentManager().getBackStackEntryCount(),反之亦然 (5认同)