片段 – 你是否需要在构成整个Activity的片段周围使用Activity Wrapper?

考虑来自developers.android.com的示例应用程序

这里描述了如何使用Fragments:

  • 在电话上,您可以使用活动A上的片段1和活动B上的片段2。
  • 在平板电脑上,您可以使用更多的房地产,因此您可以在活动A上使用片段1和片段2。

大! …但是…在第一个例子(电话那个),你创build一个活动与包含一个单一的<fragment>的xml文件,这就是所有的活动,你只能在该XML调用setContentView() ? 这看起来像很多冗余代码(活动,XML和片段显示一个片段):你可以设置一个Fragment作为一个Activity或者是一个总是需要XML的包装

Solutions Collecting From Web of "片段 – 你是否需要在构成整个Activity的片段周围使用Activity Wrapper?"

啊,在这里find了

 public class MainMenuHolder extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // If not already added to the Fragment manager add it. If you don't do this a new Fragment will be added every time this method is called (Such as on orientation change) if(savedInstanceState == null) getSupportFragmentManager().beginTransaction().add(android.R.id.content, new MainMenuFragment()).commit(); } } 

FragmentActivity允许你设置Fragment作为android.R.id.content的内容,我假设它是树干视图的android内部ID。

用这种方法,你最终还是会有一个大多数的冗余活动(如果你想要的就是作为Activity的Fragment)。 但是仍然有一半的活动和一个XML文件充当容器。

任何其他答案将不胜感激!

在线的例子并没有填补所有的空白。 我会尽量直接回答你的问题:

“在第一个例子(带电话的例子),你应该创build一个活动与XML文件包含一个单一的活动,只调用该XML的setContentView(),这一切?

你已经开始在正确的地方。 但除此之外还有更多。 在Android中总是有一个以上的方法来解决问题,但推荐的方法是根据有效的方式产生dynamic数量的碎片。 房地产是:

  1. 在/ layout中为主要(默认)目标方向/设备/窗体/ SDK创build布局XML文件
  2. 为其他目标设备创build最小宽度基线的布局XML文件。 您可能还想要定位其他方向,SDK等
  3. 每个布局XML文件将拥有自己的一组定义片段
  4. 在活动中,检查哪些片段存在。

显然,可以采用类似的策略来进行程序化布局。

在您的原始问题的示例中(来自Google的文档),您可以:

  • 布局/ main.xml ::这个布局只会有片段1
  • layout-sw600dp / main.xml ::这个布局将有碎片1,2

然后在MainActivity.java中,您将检查每个片段的存在。 要做到这一点,你可以使用FragmentManager#findFragmentById()来进行检查,如果findFragmentById()为Fragment-2返回null,那么MainActivity知道设备已经加载了layout / main.xml并且只支持一个片段。

从示例中逐步回来,有点显示:在使用片段之前,您可能已经使用startAcitityForResult(int)从活动A调用了活动B. 在Fragment范例中,你可能只需要从Fragment 2中得到一个结果就会在Fragment 1中发生一些事情,所以MainActivity成为这个守门员是合理的。 当你展开这个例子时,你可能会发现在其他应用程序中,MainActivity可能需要调用其他活动 – 无论出于何种原因。 也许你的目标是一个有足够的房地产3片大型平板电脑,但在手机上,需要3个活动。 事情可以变得有趣,但Fragment API是相当强大的。

“你可以设置一个片段作为一个活动,或者是使用碎片时总是需要的包装?

片段不是一个活动。 事实上碎片是由活动加载,所以是的,可能会说包装总是需要的。 你正在接触碎片的另一个微妙方面。 尽pipe活动的行为类似于MVC控制器,但片段可以称为“微型控制器”,因为它们的生命周期既像一个Activity,又与Activity一起执行。 同样,片段的生命周期被包含在pipe理片段的活动的生命周期内(“被包装”)。 我build议熟悉http://developer.android.com/guide/topics/fundamentals/fragments.html#Lifecycle中logging的片段生命周期&#x3002;

更一般地说,你可以创build一个片段容器类:

 public class SingleFragmentActivity extends Activity { public static final String FRAGMENT_NAME = "fragmentName"; public static final String FRAGMENT_ARGUMENTS = "fragmentArguments"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); String fragmentName = getIntent().getStringExtra(FRAGMENT_NAME); Fragment fragment = Fragment.instantiate(this, fragmentName); Bundle fragmentArguments = getIntent().getBundleExtra(FRAGMENT_ARGUMENTS); fragment.setArguments(fragmentArguments); getSupportFragmentManager().beginTransaction().replace(android.R.id.content,fragment, "tag").commit(); } } 

现在你使用这个类来实例化任何片段作为一个独立的活动:

 public void showFragmentAsActivity() { Intent intent = new Intent(this, SingleFragmentActivity.class); intent.putExtra(SingleFragmentActivity.FRAGMENT_NAME, MyFragment.class.getName()); intent.putExtra(SingleFragmentActivity.FRAGMENT_ARGUMENTS,MyFragment.getArgumentsBundle("a string argument")); startActivity(intent); }