【问题标题】:Exiting from Activity with only fragments仅使用片段退出 Activity
【发布时间】:2017-11-14 05:42:47
【问题描述】:

我的应用包含一个空活动和几个片段。活动的onCreateactivity_main.xml 中的空视图替换为包含一些按钮的MainFragment。每个按钮启动一个单独的片段,用户可以从一个片段导航到另一个片段,等等。

按下后退键时,当前片段正确地替换为前一个片段,直到您到达MainFragment。当用户从MainFragment 按下时,它会隐藏主要片段,您会看到主要活动的白色空白背景。但我现在想退出活动,因为这是明智的行为。

如果片段管理器中没有片段,我可以通过第二次从 onBackPressed 调用 super.onBackPressed() 来实现这一点。

@Override
public void onBackPressed() {
    super.onBackPressed();
    FragmentManager manager = getSupportFragmentManager();
    List<Fragment> fragments = manager.getFragments();
    if (fragments == null || fragments.size() == 0) {
        Log.d(TAG, "No more fragments: exit");
        super.onBackPressed();
    }
}

这是可以接受的做法吗?它会在活动工作流程中产生任何问题吗?有没有更好/标准的方法来处理这种情况?

【问题讨论】:

  • PS:我曾经在activity_main.xml中而不是片段中拥有按钮列表,但随后触摸其他片段的空白区域会导致活动中按钮的点击事件。我必须在所有片段上使用clickable=true 以避免这种情况。我认为即使是初始屏幕也可以使用片段来解决这个问题。
  • 删除第一个调用:super.onBackPressed();... 只在 if 语句中留下那个调用

标签: android android-fragments android-activity


【解决方案1】:

这样做没有问题,但如果您将主片段添加到您不调用 .addToBackStack() 的活动中,可能会更容易

【讨论】:

  • 这是正确的解决方案,现在我什至不需要覆盖onBackPressed。谢谢。
【解决方案2】:

您实际上不需要在 Activity 中覆盖 onBackPressed。我建议实现一种在您的 Activity 中添加片段的方法:

protected void addFragment(Fragment fragment, boolean addToBackStack) {
    String tag = fragment.getClass().getName(); //It's optional, may be null
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.your_container_id, fragment, tag);

    if (addToBackStack) {
        transaction.addToBackStack(tag);
    }

    transaction.commit();
}

并修改您的 onCreate 活动方法,如下面的 sn-p:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        // Add your fragment only if it is a first launch, 
        // otherwise it will be restored by system 
        addFragment(new YourFirstFragment(), false);
    }
}

对于所有其他片段,请使用:

addFragment(new OtherFragment(), true);

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多