ViewStub

ViewStub

布局惰性加载机制,它是不可见的占据窗口大小为0的一个View,在运行时加载布局资源,当其visible或者调用inflate()方法时,就会变为可见,并将其本身加载出来的布局传递给父布局,但是他只能被加载一次,重复加载会报这个错误 Caused by: java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent。因为他加载完本身就不存在了,自然不能调用。

通常一个布局里面对应不同状态有好几个布局的时候,会写到一起,设置他们的Visibility属性为gone或者invisible,在代码中进行逻辑控制展现,比较麻烦,而且这样写虽然看不到,但扔被实例化,消耗资源,而ViewStub则进行了性能优化。

使用

首先我们在布局中定义一个ViewStub,里面有一个layout属性,就是我们要惰性加载的布局,在这里已经定义好了,只是默认不可见,不占据空间

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ViewStub
        android:id="@+id/stub"
        android:layout="@layout/subtree"
        android:layout_width="120dip"
        android:layout_height="40dip" />

</LinearLayout>

接下来在主活动中进行处理

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewStub viewStub=findViewById(R.id.stub);
        //viewStub.setVisibility(View.VISIBLE);
        View inflated=viewStub.inflate();//与上一个写法一样效果(设置其可见与用inflate()加载一样)
        //viewStub.inflate();写第二遍会报错,只能加载一次
        TextView hintText=inflated.findViewById(R.id.text);
        hintText.setText("qwerty");
    }
}

直接调用 viewStub.inflate()也可以,只不过用View接一下,可以继续处理布局里面的控件。

参考: https://www.jianshu.com/p/175096cd89ac

https://blog.csdn.net/cx1229/article/details/53505903

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
viewStub是一个轻量级的View,它可以延迟加载布局资源,而不必在Activity或Fragment的onCreate方法中立即加载视图树,这样可以提高应用程序的性能。而viewBinding是一种新的方式,它允许您直接从布局文件中获取对视图的引用,而不必使用findViewById()方法。当您使用viewStub时,您需要在布局文件中定义一个viewStub元素,然后在代码中使用它来加载布局资源。而当您使用viewBinding时,您需要在Activity或Fragment的onCreate方法中初始化绑定对象,然后使用它来获取对布局文件中的视图的引用。如果您要在使用viewBinding的情况下使用viewStub,您可以使用ViewBinding.inflate()方法来创建ViewBinding对象,然后使用ViewBinding.getRoot()方法来获取根视图,然后将其传递给viewStub的setVisibility()方法来显示或隐藏它。例如,您可以使用以下代码来显示viewStub: ``` private lateinit var binding: ActivityMainBinding private lateinit var stub: ViewStub override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) stub = binding.viewStub val inflatedView = binding.viewStub.inflate() // Do something with inflatedView } ``` 在这个例子中,我们首先使用ViewBinding.inflate()方法初始化了绑定对象,然后使用ViewBinding.getRoot()方法获取根视图,并将其传递给viewStub的setVisibility()方法来显示它。然后,我们使用viewStub的inflate()方法来加载布局资源,并将返回的视图对象保存在一个变量中,以便我们可以在代码中使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值