103

AndroidFragments. 昨天我这样做并成功实现Fragments了自定义类的数据可视化。

我的问题是:Fragments与简单地从自定义对象获取视图相比,使用它有什么好处,并且仍然支持 API 1.5?

例如,假设我有类 Foo.java:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

这两种方法在一个 Activity 中创建和使用都非常简单,比如说,有一个List<Foo>要显示的(例如,以编程方式将每个添加到 a ScrollView),所以它们Fragments真的很有用,或者它们只是过度美化的简化得到一个视图,比如通过上面的代码?

4

6 回答 6

174

使用 Fragments 的主要原因是用于 backstack 和生命周期功能。否则,自定义视图更轻量级且更易于实现。

起初,我实际上尝试使用自定义视图构建手机/平板电脑应用程序。一切似乎都可以在手机和平​​板电脑上运行,甚至从单面板切换到拆分面板。我遇到麻烦的地方是后退按钮和生命周期。由于我只是手动更新视图......没有任何东西可以跟踪视图的历史及其状态。因此,后退按钮没有按预期工作,并且即使在生命周期事件期间(例如旋转应用程序时)也很难重新创建最新状态。为了解决这个问题,我必须将我的自定义视图包装在片段中并使用 FragmentManager 以便保存和重新创建以前的状态。

在回答一年前我发布了一个类似的问题后,我意识到: https ://stackoverflow.com/a/11126397/618881

于 2013-04-05T01:07:39.433 回答
27

我想说片段在两种情况下很有用:如果您在某些设备/方向上拆分视图并将它们显示在两个活动中,并在其他设备上显示所有内容。如果您使用平板电脑或什至在手机上以横向模式使用,这将是一个用例:例如,您在一个屏幕上显示项目列表和详细信息。在手机或纵向模式下,您只显示一个部分。

另一个用例是可重用的视图。因此,如果您有一些在不同活动上可见的视图并且还执行一些操作,您可以将此行为放入片段中,然后重用它。显然,您也可以使用自定义小部件来做到这一点。

我看不出有任何理由为每个视图使用片段,我想这只是开销。我只在第一个用例中使用它们,我想说这是一种简化。

于 2011-12-23T15:52:58.883 回答
3

Android 在 Android 3.0(API 级别 11)中引入了 Fragment,主要是为了在平板电脑等大屏幕上支持更动态和灵活的 UI 设计。因为平板电脑的屏幕比手机大得多,所以有更多的空间来组合和交换 UI 组件。片段允许这样的设计,而无需您管理对视图层次结构的复杂更改。通过将活动的布局划分为片段,您可以在运行时修改活动的外观并将这些更改保存在活动管理的后退堆栈中。

在这里你可以阅读更多。

于 2011-12-23T15:55:18.223 回答
3
  1. 场景活动分屏 - 我们有一个布局和一个处理左右屏幕部分的活动
  2. 场景 FragmentActivity 我们有一个主屏幕布局,一个用于左侧,一个用于右侧

如果您有简单的应用程序,场景一很好。

如果您想拥有多个 Fragment 和多个 FragmentActivity 并且您可以将其中的每一个结合起来,场景二就很好。您还可以在片段之间进行交互。

我有分屏Fragmentactivity,我可以用'Intent Extras'调用它,并告诉fragmentActivity要加载哪个片段。片段很好,因为它们不在清单中,因此您可以制作可重用的片段和 FragmentActvity。

但这会使您的项目更大。但是,如果您制作大型项目,则可以节省很多。因为您可以使用相同的片段或相同的片段活动。

而且我认为这些片段来得有点晚,所以你必须尝试以新的方式思考。也许只是尝试将您的活动转换为 FragmentActivity。稍后尝试找到可重用的代码并从中制作片段。

它很有用,但我现在不知道如何。但我有一些想法。

这总是问题。Android 团队做了一些思考,没有人知道什么是好的。因为我们几乎没有像以前那样学习,所以它出现了一些新东西。

在我看来,这很好,但不是因为谷歌告诉我们的原因。

于 2013-01-18T15:38:01.317 回答
0

在 CustomView 上使用 Fragment 或 Activity 时添加一种情况:

当您使用 CursorLoader 观察某些视图、ListView 或 TextView 并希望在 ContentProvider 的数据在后端更新时更新它们的显示值(最常见的情况是,您有一项服务通过定期轮询远程数据库/云中的数据来更新本地数据库)

于 2013-11-05T01:41:49.900 回答
-2

上述所有评论都没有提到的一件大事是,即使 Android 杀死活动并在您执行更改设备方向之类的操作时重新启动它,片段仍然驻留在内存中。这样做是出于性能原因,但如果您希望片段被销毁,却发现它们不知从何处重新创建,也可能导致意外结果。

于 2015-07-24T19:54:46.857 回答