视图和碎片

时间:2014-07-16 20:26:25

标签: android-fragments

我最近一直在阅读片段,几乎所有人都说我们应该使用它。我仍然无法理解这个概念。我看过this,但我还有一些问题。

首先:片段必须与活动相关(如果它是正确的词),比如说MainActivity,片段有自己的布局,MainActivity有自己的两个。那么屏幕上会显示什么?片段布局或MainActivity或Both ??

第二:如果我想将现有代码转换为使用片段,那么主要的变化是什么?

第三:如果我想拥有多个片段,我是否必须为我想要创建的每个片段添加一个扩展Fragment的类?

Forth:扩展onCreateView的类的Fragment返回一个视图,在其中创建一个视图并将其返回给主活动以将其添加到其布局是否正确?

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

以下是我目前所理解的片段的一些提示,它可能有助于您理解片段:

1:关于你的第一个问题,是的(活动和片段)都有自己的布局,但活动布局作为片段的基础布局,但这也取决于你正在使用的布局。如果我陈述一个HelloWorld应用程序的简单示例(当您在更新的adt中首次在eclipse中创建Project时自动创建),那么您会看到Activity作为基础并且片段布局显示在其上。

2:如果你想改变现有的代码来使用片段,首先它取决于你的代码的复杂性,之后你必须改变各种各样的东西,比如你支持api 10级以下而不是你必须使用Extra Libraries.There有很多变化,但这些都取决于你的要求。

3:是的,你必须创建一个扩展Fragment或任何其他Subment of Fragment的Class。这个类就像你的Activity类一样,你可以在其中使用xml布局。

4:是的,您必须在OnCreateView()中定义一个视图,以将其返回到要添加到其布局或显示UI的活动。

碎片就像活动一样,当您使用嵌套碎片时会产生痛苦。并且片段的生命周期与Activity略有不同。

注意:如果您有其他疑问或对上述书面陈述有任何疑问,请告诉我。

答案 1 :(得分:1)

首先:

MainActivity的布局中,您可以嵌入多个片段布局。您甚至可以在任何其他活动中重用这些片段布局。啊,好功能!

第二名:

  

如果我想将现有代码转换为使用片段,那么它是什么   主要变化?

要在现有代码中使用片段,您只需要

片段将使用布局中的<fragment>元素添加到活动中,或者可以动态添加。

要检查片段是否已经是布局的一部分,您可以使用FragmentManager类 -

DetailFragment fragment = (DetailFragment) getFragmentManager().
  findFragmentById(R.id.detail_frag);
if (fragment==null || ! fragment.isInLayout()) {
  // start new Activity
  }
else {
  fragment.update(...);
} 

如果在XML布局文件中定义了片段,则android:name属性指向相应的类。

要动态地将片段添加到现有布局,通常需要在XML布局文件中定义一个容器,您可以在其中添加片段。

为此,您可以使用例如FrameLayout元素。

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.your_placehodler, new YourFragment());
ft.commit(); 

新的Fragment将替换先前添加到容器中的现有Fragment。

如果您要将交易添加到Android的backstack,请使用addToBackStack()方法。

这会将动作添加到活动的历史堆栈中,即,这将允许通过后退按钮恢复碎片更改。

第三:

  

如果我想拥有多个片段,我是否必须添加一个类   为我想要创建的每个片段扩展Fragment ??

要定义新片段,您可以扩展android.app.Fragment类或其子类之一, 例如,ListFragmentDialogFragmentPreferenceFragmentWebViewFragment

Forth:

  

扩展Fragment的类的onCreateView返回一个视图,就是这样   更正在其中创建一个视图并将其返回给主活动   将其添加到其布局??

无需将其返回到主活动以将其添加到其布局中。只需在FragmentTransaction's replace内使用Main Activity,然后commit即可完成。