您的位置:首页 > 产品设计 > UI/UE

Android开发之UI性能优化(1)-ViewStub的运用

2016-09-09 10:46 381 查看
<span style="font-size:14px;"> <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 最近在研究android开发UI性能优化,并且把get到的比较好的优化技能给大家分享下。今天分享的是ViewStub的运用,有需要的童鞋可以参考下。</span></span>
(1)我在看到ViewStub的作用后,曾有点疑问,我们平时在布局的时候很习惯性的将某个按需显示的view的可见性设置为gone,需要显示的时候再设置为visiable,并且设置为gone属性后,该view除了不显示为可见,还不会占用位置空间。看起来并没有什么不好,但你从内存占用的角度思考下,就会觉得不妥了,这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。这也是为什么我推荐使用ViewStub的原因了。

(2)看代码 ,xml文件,viewstub_layout.xml

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

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="BtnOnClick"
android:text="显示" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="BtnGoneClick"
android:text="隐藏" />

<ViewStub
android:id="@+id/viewStub"
android:layout_width="match_parent"
android:layout_height="50dp"
android:inflatedId="@+id/tv"
android:layout="@layout/include_layout" />
</LinearLayout>(3)include_layout.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical">

<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="11111" />
</LinearLayout>

(4)其实看xml文件大概就知道什么意思了,就是让include_layout布局里的内容显示和隐藏。再看下Java代码
public class MainActivity extends AppCompatActivity {

private ViewStub viewStub;
private TextView tv;
private View inflate;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewsub_layout);
viewStub = (ViewStub) findViewById(R.id.viewStub);
//inflate = ((ViewStub) findViewById(R.id.viewStub)).inflate();
}

public void BtnOnClick(View view) {
viewStub.setVisibility(View.VISIBLE);
tv = (TextView)findViewById(R.id.tv_test);
tv.setText("3434");
}
public void BtnGoneClick(View view) {
viewStub.setVisibility(View.GONE);
}

}
(5)这段代码主要是通过2各按钮控制viewStub里面的内容显示和隐藏,viewStub内容的显示有2种方法,一种是调用viewStub的inflate()方法,还有一种是setVisibility属性为VISIABLE,如上面代码中increase方法中所示。值得注意的是viewStub只能被inflate一次,这也是我把inflate方法调用放在oncreate里面的原因,当然,你也可以放在BtnOnClick方法中,当你第一次调用BtnOnClick,程序能正常显示,当你再次点击显示按钮即再次调用BtnOnClick方法是,程序会抛异常。因为inflate的时候是将其指向的布局文件解析inflate并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub
must have a non-null ViewGroup viewParent。

(6)如果你希望能多次切换显示隐藏,你可以使用 viewStub.setVisibility(View.VISIBLE);的方式显示viewStub内容,上面的代码能正常切换显示和隐藏。Ps,如果要操作Viewstub布局文件中的控件,记得在inflate之后或者设置viewStub.setVisibility(View.VISIBLE)之后,find
ID再操作,否则会报空指针异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息