【问题标题】:Back button between fragments片段之间的后退按钮
【发布时间】:2014-04-10 22:00:25
【问题描述】:

我目前正在从事一个项目,该项目的活动由两个片段组成。

  • 第一个片段显示了一个自定义的可扩展列表。每一行都是根据自定义布局创建的,该布局的右侧有一个复选框。
  • 第二个片段显示有关列表中单击的行的更多详细信息。为了打开第二个片段,用户必须单击该行。该复选框用于其他原因。

所以,我要做的是仅在应用程序在平板电脑中运行时并排显示这两个片段。当应用在手机中运行并且用户按下一行时,第二个片段应该显示在顶部。

此外,我在屏幕顶部有一个操作栏,它实现了通常的后退按钮。

当我已经选择了一些复选框时打开第二个片段时存在问题。当我按下返回按钮时,它会将我导航到第一个片段,复选框将不会被选中。

显然没有调用 onSaveInstanceSate 方法(因为父活动没有暂停),所以我无法保存存储检查行的 ArrayList。

最后但同样重要的是,片段是动态添加的。

问题

如何正确实现后退按钮,以便用户使用时

  1. 平板电脑,应该使用后退按钮来关闭活动,或者
  2. 手机,所以后退按钮应该用作返回到第一个片段的导航,并能够恢复它的先前状态?

【问题讨论】:

  • 所以真正的问题是复选框没有正确保存选中状态?如果这是真的,请确保在创建列表片段时调用 setRetainInstanceState(true)。对于布局问题,创建两个不同的布局,让android选择一个合适的。
  • 首先,很抱歉@ScottNaef 我迟到的评论,并感谢您的重播。 setRetainInstanceState(true) 似乎没有解决我的问题。两种布局技巧对我来说不是一个选择。我认为您建议了两种不同的布局,其中第一个在布局目录中声明第一个片段,而另一个在 layout-large 目录中声明两个片段。好吧,我动态添加我的片段。如果这就是你真正的意思,那可能不是我要找的答案。

标签: android android-fragments


【解决方案1】:
if (mFragmentManager.getBackStackEntryCount() == 0) {
        LogUtil.d(TAG,
                "home fragment" +      mFragmentManager.getBackStackEntryCount());

        this.finish();
    } else {

        mFragmentManager.popBackStackImmediate();


        }

试试这个应该可以,祝你编码愉快

【讨论】:

  • 感谢您的回答!!!好吧,我的 backStack 总是 0 大小。我还调用了 addToBackStuck() 方法。我在托管两个片段的父活动中的 onBackPressed() 方法中实现了这一点。
【解决方案2】:

我的第一个想法是在项目的资源中创建一个布尔值:例如,在“values”目录中,您的布尔值将为 false,而在“values-sw600dp”和“values-sw720dp-land”中" 目录,布尔值为真。

然后,在您的代码中,您将检查布尔值(使用 R.boolean.your_boolean)以了解这是平板电脑还是手机。

然后,使用简单的 if/else,您将根据您的布尔值实现您的代码...

if(yourBoolean){
//We are on a tablet
finish();
}else{
//We are on a handset
//Your code to navigate back...
}

【讨论】:

    【解决方案3】:

    您需要 (1) 检测用户是否在平板电脑上并 (2) 相应地控制返回功能。我不确定您目前如何检测设备是否是平板电脑,但一个非常简单的方法是described here。它涉及一个布尔资源,您可以在自定义返回函数以确定设备类型时访问该资源。

    我要做的是在您的主机Activity 中覆盖 onBackPressed 并从那里控制返回功能

    @Override
    public void onBackPressed(){
        boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
        if (tabletSize){
            moveTaskToBack(true);
        } else {
           //handle fragment back stack  
        }
    }
    

    处理回栈和替换片段的信息是here in the android docs。我稍后会更新该部分,但我现在必须运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多