在Android中使用片段而不是视图有什么好处?

在Android中使用片段而不是视图有什么好处?,android,android-fragments,android-view,android-lifecycle,software-design,Android,Android Fragments,Android View,Android Lifecycle,Software Design,在为Android开发时,您可以将目标(或最低)sdk设置为4(API 1.6),并添加Android兼容包(v4),以添加对片段的支持。昨天我这样做了,并成功地实现了片段,以可视化自定义类中的数据 我的问题是:使用片段与简单地从自定义对象获取视图并仍然支持API 1.5相比,有什么好处 例如,假设我有Foo.java类: public class Foo extends Fragment { /** Title of the Foo object*/ private Stri

在为
Android
开发时,您可以将目标(或最低)sdk设置为4(API 1.6),并添加Android兼容包(v4),以添加对
片段的支持。昨天我这样做了,并成功地实现了
片段
,以可视化自定义类中的数据

我的问题是:使用
片段
与简单地从自定义对象获取视图并仍然支持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

这两种方法的创建和使用都非常简单,例如,在一个要显示
列表
的活动中(例如,通过编程将每种方法添加到
滚动视图
),那么
片段
是否真的非常有用,或者它们只是获得视图的一种过分美化的简化,例如,通过上面的代码?

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

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

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

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

你可以读更多

  • 场景活动拆分屏幕-我们有一个布局和一个活动处理左右屏幕部分
  • 场景片段活动我们有一个主屏幕布局,一个左一个右
  • 如果您有简单的应用程序,那么场景一是好的

    如果您想要有多个片段和多个片段活动,那么场景二很好 你可以把它们结合起来。还可以在片段之间进行交互

    我有分屏Fragmentactivity,我可以用“意图附加”来调用它,并告诉Fragmentactivity要加载哪个片段。片段是好的,因为它们不在清单中,所以您可以创建可重用的片段和FragmentActivity

    但这会让你的项目变得更大。但如果你做一个大项目,你可以节省很多。因为您可以使用相同的片段或相同的片段活动

    我觉得这些碎片来得有点晚,所以你们必须试着用新的方式思考。 也许只是试着把你的活动转换成零碎的活动。稍后尝试寻找可重用代码并从中生成片段

    这是有用的,但我现在不知道怎么做。但我有一些想法

    这一直是个问题。Android团队做了一些思考,没有人知道什么是好的。因为我们很难像以前那样学习,现在又有了一些新的东西


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

    使用片段的主要原因是用于backbackback和lifecycle特性。否则,自定义视图重量更轻,实现更简单。

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


    我在回答了一年前发布的一个类似问题后意识到:

    在CustomView上使用片段或活动时添加一个案例:


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

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

    片段不必有UI,它们可以是可重用的行为。在这种情况下,视图是多余的。我已经在另一个问题中回答了这个问题。见T;dr-有时片段允许您创建比依赖自定义视图实现更多的可重用组件。查看链接了解原因。我已经阅读了所有文档,但是我正在寻找更好地解释其优点的东西,例如平板电脑或Backback感谢,这绝对是有帮助的