在Android中使用Fragments而不是Views有什么好处?

Phi*_*hil 102 android software-design android-lifecycle android-fragments android-view

开发时Android,您可以将目标(或最小)sdk设置为4(API 1.6)并添加android兼容包(v4)以添加支持Fragments.昨天我做了这个并成功实现Fragments了可视化来自自定义类的数据.

我的问题是:使用的好处是什么Fragments,而不是简单地从自定义对象获取View,并且仍然支持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
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*nry 168

使用Fragments的主要原因是用于Backstack和生命周期功能.否则,自定义视图更轻,更容易实现.

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

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

  • 非常好的答案.我只是想补充一下,自4.2以来可以嵌套片段或支持库rev 11. (14认同)
  • 感谢@Karlo的更新.我认为这在概念上是不可能的,但他们通过getChildFragmentManager()使用私有FragmentManager来解决它.哦,它是API 17,而不是11,可以通过支持库获得. (2认同)
  • 我刚刚再次看到这个问题,我的经历也发生了变化.这个答案可以很好地理解好处和缺点,并且非常有用.谢谢! (2认同)
  • 想要 +1 这个答案,但这样做会破坏当前的分数。此外,70 不是我最喜欢的数字。 (2认同)

Mar*_*yer 27

我会说碎片在两种情况下很有用:如果你在一些设备/方向上分割视图并在两个活动中显示它们,并在其他设备上显示所有内容.如果您在平板电脑上或甚至在手机上以横向模式进行操作,那将是一个用例:例如,您在一个屏幕上显示项目列表和详细信息.在手机或肖像模式下,您只需显示一个部分.

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

我不认为有任何理由为每个View使用Fragments,我想这只是一个开销.我只在第一个用例中使用它们,我在这里说它是一个简化.