Android中的片段与自定义视图

时间:2015-07-05 23:32:45

标签: android fragment android-custom-view

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

例如,下面的代码是片段

[[:alpha:]]

自定义视图的代码

[[:digit:]]

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); } } 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); } } 都可以创建一个由TestFragmentTestCustomView组成的视图,并使用TextViewButtons的标记来声明在activity的xml布局文件中,但使用Fragment有什么好处?

3 个答案:

答案 0 :(得分:28)

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

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

有些情况下片段是颈部完全疼痛,有些情况下他们可以更快地达到效果。

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

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

答案 1 :(得分:16)

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

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

正如您所看到的,Fragments与Activities相比,与自定义视图有更多共同之处。

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

答案 2 :(得分:15)

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

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

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