gpt4 book ai didi

android - 不使用支持库的 Android 4.0、4.1 (<4.2) 中嵌套 fragment 的最佳实践

转载 作者:IT老高 更新时间:2023-10-28 13:01:22 25 4
gpt4 key购买 nike

我正在为 4.0 和 4.1 平板电脑编写应用程序,我不想使用支持库(如果不需要的话),因此只能使用 4.x api。

所以我的目标平台非常明确地定义为:>= 4.0 和 <= 4.1

该应用具有多 Pane 布局(两个 fragment ,左侧一个小 fragment ,右侧一个内容 fragment )和一个带有选项卡的操作栏。

与此类似:

enter image description here

单击操作栏上的选项卡会更改“外部” fragment ,然后内部 fragment 是具有两个嵌套 fragment (1. 左侧小列表 fragment ,2. 宽内容 fragment )的 fragment 。

我现在想知道替换 fragment ,尤其是嵌套 fragment 的最佳做法是什么。ViewPager 是支持库的一部分,此类没有 native 4.x 替代方案。在我的意义上似乎被“弃用”。 - http://developer.android.com/reference/android/support/v4/view/ViewPager.html

然后我阅读了 Android 4.2 的发行说明,关于 ChildFragmentManager ,这将是一个很好的选择,但我的目标是 4.0 和 4.1,所以这也不能使用。

ChildFragmentManager仅在 4.2 中可用

不幸的是,即使在整个 Android 开发人员指南中,也几乎没有任何好的示例可以展示在没有支持库的情况下使用 Fragment 的最佳实践;尤其是与嵌套 fragment 无关。

所以我想知道:如果不使用支持库和它附带的所有东西,就不可能编写带有嵌套 fragment 的 4.1 应用程序吗? (需要使用 FragmentActivity 而不是 Fragment 等?)或者最佳做法是什么?


我目前在开发中遇到的问题正是这样的说法:

The Android Support Library also now supports nested fragments, so you can implement nested fragment designs on Android 1.6 and higher.

Note: You cannot inflate a layout into a fragment when that layout includes a <fragment>. Nested fragments are only supported when added to a fragment dynamically.

因为我在 XML 中定义了嵌套 fragment ,这显然会导致如下错误:

Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_

此刻,我自己总结:即使在 4.1 上,当我什至不想针对 2.x 平台时,如果没有支持库,截图中所示的嵌套 fragment 是不可能的。

(这实际上可能更像是一个 wiki 条目而不是一个问题,但也许其他人之前已经管理过它)。

更新:

一个有用的答案是:Fragment Inside Fragment

最佳答案

限制

因此,无论您使用哪个版本的 FragmentManager,xml 都无法将 fragment 嵌套在另一个 fragment 中。

所以你必须通过代码添加 fragment ,这似乎是个问题,但从长远来看,你的布局会变得 super 灵活。

所以嵌套不使用getChildFragmentMangerchildFragmentManager 背后的本质是延迟加载,直到前一个 fragment 事务完成。当然,它只在 4.2 或支持库中自然得到支持。

没有 ChildManager 的嵌套 - 解决方案

解决方案,当然!我已经这样做了很长时间了,(自从 ViewPager 发布以来)。

见下文;这是一个延迟加载的Fragment,因此可以在其中加载Fragment

它非常简单,Handler 是一个非常方便的类,在当前 fragment 事务完成提交后,处理器实际上会在主线程上等待一个空间来执行(因为 fragment 会干扰UI 它们在主线程上运行)。

// Remember this is an example, you will need to modify to work with your code
private final Handler handler = new Handler();
private Runnable runPager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
return inflater.inflate(R.layout.frag_layout, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
runPager = new Runnable() {

@Override
public void run()
{
getFragmentManager().beginTransaction().addFragment(R.id.frag_container, MyFragment.newInstance()).commit();
}
};
handler.post(runPager);
}

/**
* @see android.support.v4.app.Fragment#onPause()
*/
@Override
public void onPause()
{
super.onPause();
handler.removeCallbacks(runPager);
}

我不认为这是“最佳实践”,但我有使用此 hack 的实时应用程序,而且我还没有遇到任何问题。

我也使用这种方法嵌入 View 寻呼机 - https://gist.github.com/chrisjenx/3405429

关于android - 不使用支持库的 Android 4.0、4.1 (<4.2) 中嵌套 fragment 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com