ViewStub是android中view的一种优化方案,它的目的是在不需要显示view的时候不去加载view,这样在view的创建时期,减少了加载的资源,优化了view。

下面就用代码来说明如何使用viewstub。

先上图


功能很简单,当点击traggle时,下面的viewstub会加载其中预置的layout,再次点击时,隐藏viewstub。

代码如下

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>    

text_layout.xml

<?xml version="1.0" encoding="utf-8"?>

Main_Activity.java

package com.example.listscroll;import android.app.Activity;import android.app.ListActivity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.view.LayoutInflater;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.ViewStub;import android.view.WindowManager;import android.view.animation.AnimationUtils;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {private boolean mShowed;private View mTextPanel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (mTextPanel == null) {mTextPanel = ((ViewStub) findViewById(R.id.stub)).inflate();}if (mShowed == false) {mShowed = true;showPanel(mTextPanel, true);} else {mShowed = false;hidePanel(mTextPanel, true);}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}    private void showPanel(View panel, boolean slideUp) {        panel.startAnimation(AnimationUtils.loadAnimation(this,                slideUp ? R.anim.slide_in : R.anim.slide_out_top));        panel.setVisibility(View.VISIBLE);    }    private void hidePanel(View panel, boolean slideDown) {        panel.startAnimation(AnimationUtils.loadAnimation(this,                slideDown ? R.anim.slide_out : R.anim.slide_in_top));        panel.setVisibility(View.GONE);    }}


下面是4个简单的动画效果,展示viewstub的加载

slide_in_top.xml

<?xml version="1.0" encoding="utf-8"?>        
slide_in.xml

<?xml version="1.0" encoding="utf-8"?>        
slide_out_top.xml

<?xml version="1.0" encoding="utf-8"?>        
slide_out.xml

<?xml version="1.0" encoding="utf-8"?>        

ViewStub中加载layout的代码是

    public View inflate() {        final ViewParent viewParent = getParent();// 获取当前view的父view,用于获取需要加载的layout的index        if (viewParent != null && viewParent instanceof ViewGroup) {            if (mLayoutResource != 0) {                final ViewGroup parent = (ViewGroup) viewParent;                final LayoutInflater factory;                if (mInflater != null) {                    factory = mInflater;                } else {                    factory = LayoutInflater.from(mContext);                }                final View view = factory.inflate(mLayoutResource, parent, false);// 获取需要加载的layout                if (mInflatedId != NO_ID) {                    view.setId(mInflatedId);                }                final int index = parent.indexOfChild(this);                parent.removeViewInLayout(this);// 删除之前加载的view                final ViewGroup.LayoutParams layoutParams = getLayoutParams();                if (layoutParams != null) {                    parent.addView(view, index, layoutParams);                } else {                    parent.addView(view, index);// 添加view                }                mInflatedViewRef = new WeakReference(view);                if (mInflateListener != null) {                    mInflateListener.onInflate(this, view);                }                return view;            } else {                throw new IllegalArgumentException("ViewStub must have a valid layoutResource");            }        } else {            throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");        }    }






更多相关文章

  1. 使用AXMLPrinter2,smali,baksmali来实现Android(安卓)编译,反编
  2. Android最好用的播放器ExoPlayer的使用及自定义UI
  3. Android中Toast的用法简介(转)
  4. Android注入完全剖析
  5. Android(安卓)如何获取经纬度
  6. android画图——Path()的使用
  7. ubuntu下Android源代码模块编译
  8. Android多Module合并aar打包
  9. Android学习之Adapter(适配器)源代码分析与观察者模式的运用(一)

随机推荐

  1. Android Camera2 API 学习
  2. Android(安卓)最佳实践
  3. android 让 webView 中的超链接失效
  4. Android中MAC地址获取代码
  5. Android动态权限判断以及动态权限申请
  6. android工程引入第三方jar包,如果发现混淆
  7. Android硬件设备检测
  8. Android(安卓)Graphic : apk and Skia/Ope
  9. Android刷新页面
  10. Android Studio build.gradle productFla