Android(安卓)ViewStub控件使用
16lz
2021-01-24
ViewStub是android中view的一种优化方案,它的目的是在不需要显示view的时候不去加载view,这样在view的创建时期,减少了加载的资源,优化了view。
下面就用代码来说明如何使用viewstub。
先上图
功能很简单,当点击traggle时,下面的viewstub会加载其中预置的layout,再次点击时,隐藏viewstub。
代码如下
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> text_layout" />
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"); } }
更多相关文章
- 使用AXMLPrinter2,smali,baksmali来实现Android(安卓)编译,反编
- Android最好用的播放器ExoPlayer的使用及自定义UI
- Android中Toast的用法简介(转)
- Android注入完全剖析
- Android(安卓)如何获取经纬度
- android画图——Path()的使用
- ubuntu下Android源代码模块编译
- Android多Module合并aar打包
- Android学习之Adapter(适配器)源代码分析与观察者模式的运用(一)