Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android平板电脑片段导航-单个还是多个活动?_Android_Android Layout_Android Fragments_Android Navigation - Fatal编程技术网

Android平板电脑片段导航-单个还是多个活动?

Android平板电脑片段导航-单个还是多个活动?,android,android-layout,android-fragments,android-navigation,Android,Android Layout,Android Fragments,Android Navigation,我希望实现这样的导航(下图),其中片段A、B、C、d表示应用程序信息层次结构下的导航 在手机上只能看到一个片段,在平板电脑上可以看到两个片段 我看到的所有教程和文档(例如和)都提到了主细节视图,其中左侧似乎有一个主片段,右侧似乎有一个细节视图,但似乎没有人指定如何从细节中钻得更深 事实上,GMail平板电脑应用程序就像我自己的应用程序一样。假设片段A是帐户和文件夹列表,片段B是电子邮件列表,片段C是对话本身 此屏幕是带有片段A和B的配置 此屏幕包含片段B和C 问题是:我应该用一个活动来实现

我希望实现这样的导航(下图),其中片段A、B、C、d表示应用程序信息层次结构下的导航

在手机上只能看到一个片段,在平板电脑上可以看到两个片段

我看到的所有教程和文档(例如和)都提到了主细节视图,其中左侧似乎有一个主片段,右侧似乎有一个细节视图,但似乎没有人指定如何从细节中钻得更深

事实上,GMail平板电脑应用程序就像我自己的应用程序一样。假设片段A是帐户和文件夹列表,片段B是电子邮件列表,片段C是对话本身

此屏幕是带有片段A和B的配置

此屏幕包含片段B和C

问题是:我应该用一个活动来实现这一点吗

  • 对于手机,我将为碎片提供一个框架布局
  • 对于平板电脑,我将有两个“左”和“右”片段的框架布局
如果是,我将如何插入新片段?在FragmentTransaction中,我有两个可用操作-
add()
replace()

  • 如果我使用
    add()
    ,那么下面的片段似乎是活动的(它们没有进入暂停状态)并保留其完整状态(但可能会浪费一些资源)(因此在片段D中,所有的C、B和A仍然存在),在后退按钮上,滚动状态和加载的数据仍然存在
  • 如果我使用
    replace()
    ,那么前面的片段将被删除,因此在任何时候顶部都只有一个(在手机上)片段,在“后退”按钮上,事务将被撤销,旧片段被重新添加,但它将记不起以前的状态
在我看来,这些选择都不正确。教程在FragmentTransaction中使用replace(),但如何恢复之前片段的状态,例如在GMail手机应用程序中,片段B通过无休止的滚动从服务器加载,然后当我将其替换为片段C并返回时,B应该显示在其关闭的位置,对吗


我真的不知道该做什么或去哪里找,请建议。

我对你的问题做了一些研究,我不认为同样的程序适用于电话和桌子,但如果是这样,请看一下:

        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();
这是负责更改片段的代码的一部分,这些片段最初取自

本教程包含完成平板电脑设计的所有步骤

每当我需要android帮助时,我都会参考这个网站!
享受

正如您所知,分段是为以下目的而设计的

尽管我必须承认,我没有看到直接针对A-B-C-D场景的代码示例或教程,但这甚至贯穿整个活动。如果活动1可以使用B的段实例,那么活动2也可以使用自己的B段实例。您还可以从应用程序内外的其他位置直接链接到活动2

在活动1之外定义B段,并在A-B和B-C中使用。然后
startActivityForResult()
activity 2实例化另一个B段。当用户使用“后退”按钮时,他们应该在活动1中以其B段的最新状态结束


您甚至可以尝试在一个活动中重复使用所有段。。但是除了GUI转换动画之外,我看不到任何优势。

只使用一个活动,但每个活动都有不同的片段事务。使用线性布局作为活动的根,我们称之为
R.id.content
并创建一个新的XML值,如下所示:

  • /values/device.xml

    true

  • /values-sw600dp/device.xml

    false

那么您的交易将如下所示:

  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  Frag_C f = new Frag_C();
  if(getResources().getBoolean(R.bool.isPhone)){ // phone
     ft.replace(R.id.content, f, Frag_C.TAG);
  }else { // tablet
     Fragment left = getSupportFragmentManager().findFragmentByTag(Frag_A.TAG);
     Fragment right = f;
     ft.hide(left);
     ft.add(R.id.content, right, FRAG_C.TAG);
  }
  ft.addToBackStack(null).commit();
最后一点是,在对每个碎片充气时,必须设置LinearLayout的布局参数
WEIGHT
,以控制碎片的宽度。诸如此类:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   View v = inflater.inflate(layoutId(), container, false);
   ((LinearLayout.LayoutParams) v.getLayoutParams()).weight = 1;
}
所以fragA权重是1,然后B=2,然后C=4,然后D=8(例如)。所以左边的碎片宽度是33%,右边是66%。根据需要更改值


如果您想知道如何设置这些事务的动画,请参考我之前给出的答案

,也感谢您指出我可以在一个FragmentTransaction中修改多个片段。官方Android文档声明您应该使用两个活动,如下所述: