Android中的片段与自定义视图

Kai*_*i Y 53 android fragment android-custom-view

片段和自定义视图可以实现类似的功能,我知道片段比自定义视图更具可重用性,使用片段的任何其他好处/增强功能?片段是否应该取代自定义视图,或者只是针对某些特定目的的增强?

例如,下面的代码是片段:

public class TestFragment extends Fragment {

    private TextView tv_name;
    private Button btn_play;
    private Button btn_delete;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.testfragment, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();

        tv_name = (TextView)getView().findViewById(R.id.tv_name);
        btn_play = (Button)getView().findViewById(R.id.btn_play);
        btn_delete = (Button)getView().findViewById(R.id.btn_delete);

    }
}
Run Code Online (Sandbox Code Playgroud)

自定义视图的代码:

public class TestCustomView extends LinearLayout {

    private TextView tv_name;
    private Button btn_play;
    private Button btn_delete;

    public TestCustomView(Context context, AttributeSet attrs){
        super(context, attrs);

        setOrientation(LinearLayout.HORIZONTAL);
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        tv_name = new TextView(context);
        addView(tv_name);

        btn_play = new Button(context);
        addView(btn_play);

        btn_delete = new Button(context);
        addView(btn_delete);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.testfragment, container, false);
    }
}
Run Code Online (Sandbox Code Playgroud)

双方TestFragmentTestCustomView可以创建包含的观点TextView,并Buttons和使用的标签Framelayout/fragmentcom.packagename.TestCustomView在活动的XML布局文件中声明,但有什么用碎片的优势是什么?

Dim*_*nov 30

片段可以在不同的场景中使用,但最常用的是:

  • 包装在视图周围
  • 无头片段 - 即没有视图=>一般不是很有帮助,但可以使用
  • 可保留的片段 - 可以是上述任何一种.通过使用Fragment.setRetainInstance(true),您可以绕过Fragment.onDestroy(),即可以保留片段数据配置更改但片段视图结构仍然被销毁/重新创建
  • 可以添加到活动后台堆栈,即轻松后退按钮以前的状态恢复

有些情况下片段是完全疼痛的颈部,然后有些情况下他们可以更快地获得结果.

对于一些自定义和更灵活的情况,片段可能变得混乱,并且管理它们将是困难的.因此,直接处理视图可以非常方便,对某些情况更有帮助.但一切都基于要求.

Note View也有自己的生命周期,可以存储/重新创建已保存的实例状态.一点点工作,但它也有选择.

  • Thans的答案.很高兴看到一些具体的例子来证明在视图上使用片段的优缺点,反之亦然,以帮助更好地理解哪种方法更合适.目前,它看起来像碎片是要走的路,但再一些例子可能有助于理解这种方法的可能缺点. (2认同)

Bla*_*der 19

自定义视图具有简单的优点,其主要目的是在屏幕上显示一段数据.他们必须依赖其他组件才能做得更多.

将Fragments视为一个功能单元,一种使用一个或多个视图显示具有特定用途的UI的一部分的方法.片段连接到Activity生命周期,它们可以包含和控制Loaders以使用数据填充Views.它们还可以包括子片段.最后,它们也可以添加到合成后堆栈中.他们可以做很多事情,而且学习起来有些复杂.

如您所见,Fragments与Activities相比,与自定义视图有更多共同之处.

作为旁注,片段也可以是无头的(没有UI).无头片段提供了一种在单独的组件中封装依赖于Activity生命周期的非可视功能的方法.

  • 一切都是真的,但这并不能解释使用片段而不是自定义视图的优势 (3认同)
  • 在问题中给出的示例中,没有任何优势,因为它只是显示布局中的一些静态数据。在现实世界的例子中,当你需要依赖用户交互来构建复杂的界面、加载数据、在你的应用程序中创建部分等时,你需要同时使用两者。我的回答的重点是你不能在同一水平上比较它们,因为它们有不同的目的。 (2认同)

Mal*_*han 15

碎片带有自己的生命周期,根据您的需要,这可能是一种阻碍或奖励.

片段获取生命周期方法,如onResume或onSavedInstanceState,它们可以帮助您处理应用程序中的状态转换.如果您使用自定义视图,则需要自己处理这类事情.

有人主张反对使用片段,我建议阅读https://corner.squareup.com/2014/10/advocating-against-android-fragments.html