Axa*_*dax 12 android android-layout android-fragments android-navigation
我想实现这样的导航(下图),其中片段A,B,C,D表示在应用程序的信息层次结构中向下导航.
在电话上只能看到一个片段,在平板电脑上有两个片段可见.
我见过的所有教程和文档(例如this和this)都提到了Master-Detail视图,左边有一个主片段,右边有一个详细视图,但似乎没有人指定如何钻从细节更深入.

事实上,平板电脑的GMail应用程序可以作为我自己的应用程序.假设片段A是帐户和文件夹列表,片段B是电子邮件列表,片段C是会话本身.
该屏幕是具有片段A和B的配置
该屏幕具有片段B和C.

问题是:我应该用一个Activity来实现它,其中
如果是这样,我将如何插入新片段?在FragmentTransaction中,我有两个可用的操作 - add()和replace().
add(),那么下面的片段似乎还活着(它们没有进入暂停状态)并保持完整状态(但可能会浪费一些资源)(因此在片段D中,所有C,B和A仍将存在),在后退按钮上,滚动状态和加载的数据仍然存在replace(),那么之前的片段将被移除,因此在任何时刻顶部将只有一个(在电话上)片段,并且在后退按钮上交易将被反转,旧片段被添加回去,但它赢了不记得以前的状态这些选项对我来说都不合适.教程在FragmentTransaction中使用replace() - 但是它们如何恢复前一个片段的状态,例如在GMail应用程序中,电话片段B从服务器加载无限滚动,然后当我用片段C替换它时然后回去,B应该出现在它停止的地方,对吧?
我真的不知道该做什么或在哪里看,请指教.
仅使用1个活动,但每个活动使用不同的FragmentTransactions.使用LinearLayout作为活动的根,让我们调用它R.id.content
并创建一个新的XML值,如下所示:
/values/device.xml
<item type="bool" format="boolean" name="isPhone">true</item>
/values-sw600dp/device.xml
<item type="bool" format="boolean" name="isPhone">false</item>
那么你的交易就像:
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();
Run Code Online (Sandbox Code Playgroud)
并且作为最后一点,当给每个片段充气时,你必须设置WEIGHTLinearLayout 的布局参数来控制片段的宽度.像这样的东西:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(layoutId(), container, false);
((LinearLayout.LayoutParams) v.getLayoutParams()).weight = 1;
}
Run Code Online (Sandbox Code Playgroud)
因此,fragA权重为1,则B = 2,则C = 4,然后D = 8(例如).所以左边的碎片宽度为33%,右边的宽度为66%.根据需要改变价值观.
如果您想知道如何为这些交易制作动画,请参阅我在/sf/answers/990864311/之前给出的答案
| 归档时间: |
|
| 查看次数: |
2052 次 |
| 最近记录: |