Android 中的片段与自定义视图

问题描述 投票:0回答:5

Fragment 和 Custom View 可以实现类似的功能,我知道 Fragment 与自定义 View 相比可重用性更高,使用 Fragment 还有其他好处/增强吗?片段是否应该取代自定义视图,或者只是出于某些特定目的的增强?

例如,下面的代码是fragment

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);
    }
}

TestFragment
TestCustomView
都可以创建一个由
TextView
Buttons
组成的视图,并使用
Framelayout/fragment
com.packagename.TestCustomView
的标签在activity的xml布局文件中声明,但是使用Fragment有什么好处?

android fragment android-custom-view
5个回答
43
投票

Fragment 可以用于不同的场景,但最常用的是:

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

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

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

注意

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


26
投票

自定义视图的优点是简单,其主要目的是在屏幕上显示一条数据。他们必须依赖其他组件才能完成更多任务。

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

如您所见,Fragments 与 Activity 的共同点比与自定义视图的共同点多得多。

顺便说一句,Fragments 也可以是无头的(没有 UI)。无头片段提供了一种依赖单独组件中的 Activity 生命周期来封装非可视功能的方法。


24
投票

片段有自己的生命周期,这可能是一种障碍,也可能是一种奖励,具体取决于您的需要。

Fragment 具有 onResume 或 onSavedInstanceState 等生命周期方法,可以帮助您处理应用程序中的状态转换。如果您使用自定义视图,则需要自己处理此类事情。

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


0
投票

使用

Fragments
而不是
Custom Views
最有用的功能是它们有自己的生命周期回调,即我们可以注册自己的
FragmentLifecycleCallbacks
Fragment
创建/销毁之前/之后执行一些操作。

我们可以创建自己的

FragmentLifecycleCallbacks
并将其注册到
Activity
,以通过
Fragment
Dagger
中注入依赖项。 也有一些解决方法可以在
Custom Views
中注入依赖项,但通过
FragmentLifecycleCallbacks
来实现会更干净、更容易。


0
投票

片段有自己的生命周期,这可能是障碍,也可能是奖励,具体取决于您的需要。

Fragment 具有 onResume 或 onSavedInstanceState 等生命周期方法,可以帮助您处理应用程序中的状态转换。如果您使用自定义视图,则需要自己处理此类事情。

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

© www.soinside.com 2019 - 2024. All rights reserved.