Android性能优化之布局优化:ViewStub的使用

迈不过友情╰ 2024-04-18 14:02 145阅读 0赞

前言

最近在看关于App性能优化的文章,看到布局优化这一块。当然布局优化这一块,最重要的一点是减少的布局的嵌套。少一层布局就能减少不少性能,避免出现布局的过度绘制。其中布局优化这一块,就提到了三种标签:include、merge、ViewStub。include主要是通过引入布局,增加布局的复用性。merge的使用可以减少一层layout达到优化layout的目的。ViewStub主要是控制布局的显示与隐藏。当前页面不需要一开始就显示某个页面的某个布局时,可以通过ViewStub来引入布局。ViewStub即显示时才加载,不显示不加载布局,不消耗性能。这一篇咱们主要重点来介绍ViewStub。

关于ViewStub

  1. ViewStub 继承自View,是一种不可见,0大小的可以在运行的时候再加载的View。

2.只有在调用inflate()进行映射内容布局之后或者设置为Visibility时才可见,ViewStub只能inflate一次,再次进行inflate的时候会报异常。

3.ViewStub有几个重要的属性:

android:id——ViewStub 自身的Id,无论是否被inflate,都可以通过findViewById拿到对应的ViewStub控件本身。

android:inflatedId——ViewStub设置的被映射的布局文件中的根节点的Id,inflate之后可以通过findViewById获取到对应的被映射的布局对象。

android:layout——将要映射的布局文件名

ViewStub.OnInflateListener——当ViewStub成功映射预先设置的布局会触发回调

ViewStub的简单使用

1.首先写一个被ViewStub引入的布局文件 layout_demo_view_stub:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:id="@+id/ll_demo_stub"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <ImageView
  8. android:layout_width="200dp"
  9. android:layout_height="200dp"
  10. android:src="@mipmap/ic_launcher"
  11. android:layout_gravity="center_horizontal"/>
  12. <TextView
  13. android:id="@+id/tv_tips"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="我是隐藏的布局"
  17. android:textSize="23sp"
  18. android:textStyle="bold"
  19. android:layout_gravity="center_horizontal"
  20. android:layout_marginTop="30dp"/>
  21. </LinearLayout>

大概显示是这个样子的:

20190907185751217.png

2.在Activity的布局中通过ViewStub引入这个布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".SecondActivity">
  8. <ViewStub
  9. android:id="@+id/viewStub"
  10. android:inflatedId="@id/ll_demo_stub"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_gravity="center_horizontal"
  14. android:layout_marginTop="20dp"
  15. android:layout="@layout/layout_demo_view_stub" />
  16. <Button
  17. android:id="@+id/button_show"
  18. android:layout_width="200dp"
  19. android:layout_height="50dp"
  20. android:layout_gravity="center_horizontal"
  21. android:text="显示" />
  22. <Button
  23. android:id="@+id/button_hide"
  24. android:layout_width="200dp"
  25. android:layout_height="50dp"
  26. android:layout_gravity="center_horizontal"
  27. android:layout_marginTop="20dp"
  28. android:text="隐藏" />
  29. </LinearLayout>

3.在Activity中的使用

  1. public class SecondActivity extends AppCompatActivity implements ViewStub.OnInflateListener {
  2. private Button button_show;
  3. private Button button_hide;
  4. private ViewStub viewStub;
  5. private TextView textView;
  6. private LinearLayout parentContainer;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_second);
  11. viewStub = findViewById(R.id.viewStub);
  12. button_show = findViewById(R.id.button_show);
  13. button_hide = findViewById(R.id.button_hide);
  14. initEventListener();
  15. initView();
  16. }
  17. private void initView() {
  18. parentContainer = (LinearLayout) viewStub.inflate();
  19. textView = parentContainer.findViewById(R.id.tv_tips);
  20. textView.setText("不好意思,还未录入任何数据");
  21. viewStub.setVisibility(View.GONE);
  22. }
  23. private void initEventListener() {
  24. viewStub.setOnInflateListener(this);
  25. button_show.setOnClickListener(new View.OnClickListener() {
  26. @Override
  27. public void onClick(View v) {
  28. viewStub.setVisibility(View.VISIBLE);
  29. }
  30. });
  31. button_hide.setOnClickListener(new View.OnClickListener() {
  32. @Override
  33. public void onClick(View v) {
  34. viewStub.setVisibility(View.GONE);
  35. }
  36. });
  37. }
  38. @Override
  39. public void onInflate(ViewStub viewStub, View view) {
  40. Log.e("==========","ViewStub is Loaded");
  41. }
  42. }

好了,到这里ViewStub的介绍就算完事了。下面附上使用ViewStub之后,Activity对应的布局文件的层级结构图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTAyNTc5MzE_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,145人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android性能优化布局优化

           不合理的布局会使我们应用程序UI性能变慢,客户体检会比较差。今天分享一些layout布局文件中的一些技巧,希望对大家写出高质量的布局文件能有一些帮助。 > 在开