`

Android 动态加载布局

 
阅读更多

Android 动态加载布局 
由于前段时间项目需要,需要在一个页面上加载根据不同的按钮加载不同的布局页面,当时想到用 tabhot 。不过美工提供的界面图完全用不上tabhot ,所以想到了动态加载的方法来解决这一需求。在这里我整理了一下,写了一个 DEMO 希望大家以后少走点弯路。 

首先,我们先把界面的框架图画出来,示意图如下: 


 


中间白色部门是一个线性布局文件,我喜欢在画图的时候用不同的颜色将一块布局标示出来,方便查看。布局文件代码如下: 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.   
  6.   
  7.     <LinearLayout android:orientation="horizontal"  
  8.         android:layout_width="wrap_content" android:layout_height="wrap_content">  
  9.         <Button android:text="加载ListView" android:id="@+id/Button01"  
  10.             android:layout_width="wrap_content" android:layout_height="wrap_content">  
  11.         </Button>  
  12.         <Button android:text="加载另外一个页面" android:id="@+id/Button02"  
  13.             android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
  14.     </LinearLayout>  
  15.     <LinearLayout android:id="@+id/LinearLayout01" android:background="#FFFFFF"  
  16.         android:layout_width="fill_parent" android:layout_height="fill_parent"></LinearLayout>  
  17. </LinearLayout>  

从上面的效果图可以看出,那块白色的线性布局是用来动态加载传进来的布局文件。好了,我们就来做如果把布局文件动态的加载进来。下面我们一步一步来实现这个效果,首先,先把需要的 XML  勾画出来,分为步骤如下。 

新建一个布局用来存放 ListView 页面,代码如下: 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout android:id="@+id/layout"  
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  4.     xmlns:android="http://schemas.android.com/apk/res/android">  
  5.     <ListView android:id="@+id/ListView01" android:layout_width="wrap_content"  
  6.         android:layout_height="wrap_content"></ListView>  
  7. </LinearLayout>  



新建一个 ListView 每一行数据的样式,代码如下: 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout android:id="@+id/LinearLayout01"  
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  4.     xmlns:android="http://schemas.android.com/apk/res/android">  
  5.     <TextView android:text="@+id/TextView01" android:id="@+id/TextView01"  
  6.         android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>  
  7. </LinearLayout>  



新建另外一个页面,用来区分此页面是动态加载的,代码如下: 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout android:id="@+id/hellolayout"  
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  4.     xmlns:android="http://schemas.android.com/apk/res/android">  
  5.     <TextView android:text="HELLO"    
  6.         android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>  
  7. </LinearLayout>  


实现ListView 的添充数据,这里不详细介绍如何填充ListView 每行数据,有不解的朋友可以回头看我写的文章:点击这里 ,代码如下: 

Java代码  收藏代码
  1. package com.terry;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. import android.content.Context;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.TextView;  
  12.   
  13. public class listAdapter extends BaseAdapter {  
  14.   
  15.     ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();  
  16.   
  17.     private LayoutInflater inflater;  
  18.     public listAdapter(Context contex)  
  19.     {  
  20.         inflater=LayoutInflater.from(contex);  
  21.         HashMap<String, Object> map=new HashMap<String, Object>();  
  22.         for (int i = 0; i < 10; i++) {  
  23.             map.put("name""例子");  
  24.             list.add(map);  
  25.         }  
  26.           
  27.     }  
  28.       
  29.     @Override  
  30.     public int getCount() {  
  31.         // TODO Auto-generated method stub  
  32.         return list.size();  
  33.     }  
  34.   
  35.     @Override  
  36.     public Object getItem(int position) {  
  37.         // TODO Auto-generated method stub  
  38.         return list.get(position);  
  39.     }  
  40.   
  41.     @Override  
  42.     public long getItemId(int position) {  
  43.         // TODO Auto-generated method stub  
  44.         return position;  
  45.     }  
  46.   
  47.     @Override  
  48.     public View getView(int position, View convertView, ViewGroup parent) {  
  49.         // TODO Auto-generated method stub  
  50.         final viewHolder myHolder;  
  51.         if (convertView==null) {  
  52.             myHolder=new viewHolder();  
  53.             convertView=inflater.inflate(R.layout.list_view_row, null);  
  54.             myHolder.tv=(TextView)convertView.findViewById(R.id.TextView01);  
  55.             convertView.setTag(myHolder);  
  56.         }  
  57.         else  
  58.         {  
  59.             myHolder=(viewHolder)convertView.getTag();  
  60.         }  
  61.         myHolder.tv.setText(list.get(position).get("name").toString());  
  62.         return convertView;  
  63.     }  
  64.   
  65. }  

项目大纲如下图: 

 

好了,到此我们的准备工作就己经完成,接下来就是要教大家如何实现动态加载上面所画的布局页面了,先看一下效果图: 

点击第一个按钮: 
 

点击第二个按钮: 
 



动态加载代码如下: 
Java代码  收藏代码
  1. package com.terry;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Color;  
  5. import android.os.Bundle;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.LinearLayout;  
  11. import android.widget.ListView;  
  12. import android.widget.TextView;  
  13.   
  14. public class dynaActivity extends Activity {  
  15.     /** Called when the activity is first created. */  
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.   
  21.         final LayoutInflater inflater = LayoutInflater.from(this);  
  22.         Button btn = (Button) findViewById(R.id.Button01);  
  23.         Button btn2 = (Button) findViewById(R.id.Button02);  
  24.         final LinearLayout lin = (LinearLayout) findViewById(R.id.LinearLayout01);  
  25.         btn.setOnClickListener(new OnClickListener() {  
  26.   
  27.             @Override  
  28.             public void onClick(View v) {  
  29.                 // TODO Auto-generated method stub  
  30.                 LinearLayout layout = (LinearLayout) inflater.inflate(  
  31.                         R.layout.listview, null).findViewById(R.id.layout);  
  32.                 ListView lv=(ListView)layout.getChildAt(0);  
  33.                 lv.setAdapter(new listAdapter(dynaActivity.this));  
  34.                 lin.removeAllViews();  
  35.                 lin.addView(layout);  
  36.             }  
  37.         });  
  38.           
  39.         btn2.setOnClickListener(new OnClickListener() {  
  40.               
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 // TODO Auto-generated method stub  
  44.                 LinearLayout layout = (LinearLayout) inflater.inflate(  
  45.                         R.layout.hello, null).findViewById(R.id.hellolayout);  
  46.                  TextView lv=(TextView)layout.getChildAt(0);  
  47.                  lv.setTextColor(Color.RED);  
  48.                 lin.removeAllViews();  
  49.                 lin.addView(layout);  
  50.             }  
  51.         });  
  52.     }  
  53. }  



上面通过使用LayoutInflater  每次点击按钮时候去读取布局文件,然后找到布局文件里面的各个VIEW 操作完VIEW 后加载进我们setContentView 方面里面的要放的布局文件里面,每次动态加载文件必需 调用 removeAllViews方法,清除之前的加载进来的 View 。是不是很简单?当然动态加载VIEW 还有许多种方法,多尝试不同写法。可能会领会不一样的心得,祝你早上掌握android 的开发技术。 
Tip:因为是基于VIEW 操作,因此你可以用 Animation 的动画效果使其更换界面更为自然,观赏性更强。 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics