可动态布局的Android抽屉之基础

我参考了这篇文章,我将它改了一下:
可动态布局的Android抽屉之基础

工程中需要这样的效果,左边和右边的Panel可以打开关闭:



我把左边和右边的Panel封装成2个类了。这里要特别注意,抽屉是需要“handler”的,我这里可以把任何View都看成“handler”,使用setBindView(View bindView)方法进行绑定“handler”。这样做的好处是“把手”可以独立于抽屉,可以任意控制把手的位置,而不需要把手跟着抽屉移动!

先看左边的Panel:
Java代码 复制代码 收藏代码
  1. import android.content.Context; 
  2. import android.os.AsyncTask; 
  3. import android.view.View; 
  4. import android.widget.LinearLayout; 
  5.  
  6. public class LeftPanel extends LinearLayout{ 
  7.      
  8.     /**每次自动展开/收缩的范围*/ 
  9.     private final static int SPEED=20
  10.     private int MAX_WIDTH=0
  11.     private Context mContext; 
  12.  
  13.     public LeftPanel(Context context,int width,int height) { 
  14.         super(context); 
  15.         this.mContext=context; 
  16.         //设置Panel本身的属性 
  17.         LayoutParams lp=new LayoutParams(width, height); 
  18.         lp.leftMargin=-lp.width; 
  19.         MAX_WIDTH=Math.abs(lp.leftMargin); 
  20.         this.setLayoutParams(lp); 
  21.     } 
  22.     /**
  23.      *
  24.      * @param context
  25.      * @param width
  26.      * @param height
  27.      * @param bindView
  28.      * @param contentView
  29.      */ 
  30.     public LeftPanel(Context context,int width,int height,View bindView,View contentView) { 
  31.         this(context,width,height); 
  32.         setBindView(bindView); 
  33.         setContentView(contentView); 
  34.     } 
  35.     /**
  36.      * 把View放在Panel中
  37.      * @param v
  38.      */ 
  39.     public void setContentView(View v){ 
  40.         this.addView(v); 
  41.     } 
  42.      
  43.     /**
  44.      * 绑定触发动画的View
  45.      * @param bindView
  46.      */ 
  47.     public void setBindView(View bindView){ 
  48.         bindView.setOnClickListener(new OnClickListener(){ 
  49.  
  50.             @Override 
  51.             public void onClick(View v) { 
  52.                 LayoutParams lp = (LayoutParams) getLayoutParams(); 
  53.                 if (lp.leftMargin < 0)// CLOSE的状态 
  54.                     new AsynMove().execute(new Integer[] { SPEED });// 正数展开 
  55.                 else if (lp.leftMargin >= 0)// OPEN的状态 
  56.                     new AsynMove().execute(new Integer[] { -SPEED });// 负数收缩 
  57.             } 
  58.              
  59.         }); 
  60.     } 
  61.      
  62.     class AsynMove extends AsyncTask<Integer, Integer, Void> { 
  63.  
  64.         @Override 
  65.         protected Void doInBackground(Integer... params) { 
  66.             int times; 
  67.             if (MAX_WIDTH % Math.abs(params[0]) == 0)// 整除 
  68.                 times = MAX_WIDTH / Math.abs(params[0]); 
  69.             else 
  70.                 times = MAX_WIDTH / Math.abs(params[0]) + 1;// 有余数 
  71.  
  72.             for (int i = 0; i < times; i++) { 
  73.                 publishProgress(params); 
  74.                 try
  75.                     Thread.sleep(Math.abs(params[0])); 
  76.                 } catch (InterruptedException e) { 
  77.                     // TODO Auto-generated catch block 
  78.                     e.printStackTrace(); 
  79.                 } 
  80.             } 
  81.             return null
  82.         } 
  83.  
  84.         @Override 
  85.         protected void onProgressUpdate(Integer... params) { 
  86.             LayoutParams lp = (LayoutParams)getLayoutParams(); 
  87.             if (params[0] < 0){//关闭 
  88.                 lp.leftMargin = Math.max(lp.leftMargin + params[0],-MAX_WIDTH); 
  89.             } 
  90.             else{//打开 
  91.                 lp.leftMargin = Math.min(lp.leftMargin + params[0],MAX_WIDTH); 
  92.             } 
  93.             if(lp.leftMargin==0 && onPanelStatusChangedListener!=null){//展开之后 
  94.                 onPanelStatusChangedListener.onPanelOpened(LeftPanel.this);//调用OPEN回调函数 
  95.             } 
  96.             else if(lp.leftMargin==-MAX_WIDTH && onPanelStatusChangedListener!=null){//收缩之后 
  97.                 onPanelStatusChangedListener.onPanelClosed(LeftPanel.this);//调用CLOSE回调函数 
  98.             } 
  99.             setLayoutParams(lp); 
  100.         } 
  101.     } 
  102.      
  103.     public interface OnPanelStatusChangedListener{ 
  104.         void onPanelOpened(LeftPanel panel); 
  105.         void onPanelClosed(LeftPanel panel); 
  106.     } 
  107.     private OnPanelStatusChangedListener onPanelStatusChangedListener; 
  108.     public void setOnPanelStatusChangedListener(OnPanelStatusChangedListener onPanelStatusChangedListener){ 
  109.         this.onPanelStatusChangedListener=onPanelStatusChangedListener; 
  110.     } 
import android.content.Context;
import android.os.AsyncTask;
import android.view.View;
import android.widget.LinearLayout;

public class LeftPanel extends LinearLayout{
	
	/**每次自动展开/收缩的范围*/
	private final static int SPEED=20;
	private int MAX_WIDTH=0;
	private Context mContext;

	public LeftPanel(Context context,int width,int height) {
		super(context);
		this.mContext=context;
		//设置Panel本身的属性
		LayoutParams lp=new LayoutParams(width, height);
		lp.leftMargin=-lp.width;
		MAX_WIDTH=Math.abs(lp.leftMargin);
		this.setLayoutParams(lp);
	}
	/**
	 * 
	 * @param context
	 * @param width
	 * @param height
	 * @param bindView
	 * @param contentView
	 */
	public LeftPanel(Context context,int width,int height,View bindView,View contentView) {
		this(context,width,height);
		setBindView(bindView);
		setContentView(contentView);
	}
	/**
	 * 把View放在Panel中
	 * @param v
	 */
	public void setContentView(View v){
		this.addView(v);
	}
	
	/**
	 * 绑定触发动画的View
	 * @param bindView
	 */
	public void setBindView(View bindView){
		bindView.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				LayoutParams lp = (LayoutParams) getLayoutParams();
				if (lp.leftMargin < 0)// CLOSE的状态
					new AsynMove().execute(new Integer[] { SPEED });// 正数展开
				else if (lp.leftMargin >= 0)// OPEN的状态
					new AsynMove().execute(new Integer[] { -SPEED });// 负数收缩
			}
			
		});
	}
	
	class AsynMove extends AsyncTask<Integer, Integer, Void> {

		@Override
		protected Void doInBackground(Integer... params) {
			int times;
			if (MAX_WIDTH % Math.abs(params[0]) == 0)// 整除
				times = MAX_WIDTH / Math.abs(params[0]);
			else
				times = MAX_WIDTH / Math.abs(params[0]) + 1;// 有余数

			for (int i = 0; i < times; i++) {
				publishProgress(params);
				try {
					Thread.sleep(Math.abs(params[0]));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return null;
		}

		@Override
		protected void onProgressUpdate(Integer... params) {
			LayoutParams lp = (LayoutParams)getLayoutParams();
			if (params[0] < 0){//关闭
				lp.leftMargin = Math.max(lp.leftMargin + params[0],-MAX_WIDTH);
			}
			else{//打开
				lp.leftMargin = Math.min(lp.leftMargin + params[0],MAX_WIDTH);
			}
			if(lp.leftMargin==0 && onPanelStatusChangedListener!=null){//展开之后
				onPanelStatusChangedListener.onPanelOpened(LeftPanel.this);//调用OPEN回调函数
			}
			else if(lp.leftMargin==-MAX_WIDTH && onPanelStatusChangedListener!=null){//收缩之后
				onPanelStatusChangedListener.onPanelClosed(LeftPanel.this);//调用CLOSE回调函数
			}
			setLayoutParams(lp);
		}
	}
	
	public interface OnPanelStatusChangedListener{
		void onPanelOpened(LeftPanel panel);
		void onPanelClosed(LeftPanel panel);
	}
	private OnPanelStatusChangedListener onPanelStatusChangedListener;
	public void setOnPanelStatusChangedListener(OnPanelStatusChangedListener onPanelStatusChangedListener){
		this.onPanelStatusChangedListener=onPanelStatusChangedListener;
	}
}

右边的Panel,需要注意构造函数多了viewBeside参数:
Java代码 复制代码 收藏代码
  1. import android.content.Context; 
  2. import android.os.AsyncTask; 
  3. import android.view.View; 
  4. import android.widget.LinearLayout; 
  5.  
  6. public class RightPanel extends LinearLayout{ 
  7.      
  8.     /**每次自动展开/收缩的范围*/ 
  9.     private final static int SPEED=20
  10.     private int MAX_WIDTH=0
  11.     private Context mContext; 
  12.  
  13.     /**
  14.      * viewBeside自动布局以适应Panel展开/收缩的空间变化
  15.      *
  16.      */  
  17.     public RightPanel(Context context,View viewBeside,int width,int height) { 
  18.         super(context); 
  19.         this.mContext=context; 
  20.      
  21.         //必须改变Panel左侧组件的weight属性 
  22.         LayoutParams p=(LayoutParams) viewBeside.getLayoutParams(); 
  23.         p.weight=1;//支持挤压 
  24.         viewBeside.setLayoutParams(p); 
  25.          
  26.         //设置Panel本身的属性 
  27.         LayoutParams lp=new LayoutParams(width, height); 
  28.         lp.rightMargin=-lp.width; 
  29.         MAX_WIDTH=Math.abs(lp.rightMargin); 
  30.         this.setLayoutParams(lp); 
  31.          
  32.     } 
  33.     /**
  34.      *
  35.      * @param context
  36.      * @param otherView
  37.      * @param width
  38.      * @param height
  39.      * @param bindView
  40.      * @param contentView
  41.      */ 
  42.     public RightPanel(Context context,View viewBeside,int width,int height,View bindView,View contentView) { 
  43.         this(context,viewBeside,width,height); 
  44.         setBindView(bindView); 
  45.         setContentView(contentView); 
  46.     } 
  47.      
  48.     /**
  49.      * 把View放在Panel中
  50.      * @param v
  51.      */ 
  52.     public void setContentView(View v){ 
  53.         this.addView(v); 
  54.     } 
  55.      
  56.     /**
  57.      * 绑定触发动画的View
  58.      * @param bindView
  59.      */ 
  60.     public void setBindView(View bindView){ 
  61.         bindView.setOnClickListener(new OnClickListener(){ 
  62.  
  63.             @Override 
  64.             public void onClick(View v) { 
  65.                 LayoutParams lp = (LayoutParams) getLayoutParams(); 
  66.                 if (lp.rightMargin < 0)// CLOSE的状态 
  67.                     new AsynMove().execute(new Integer[] { SPEED });// 正数展开 
  68.                 else if (lp.rightMargin >= 0)// OPEN的状态 
  69.                     new AsynMove().execute(new Integer[] { -SPEED });// 负数收缩 
  70.             } 
  71.              
  72.         }); 
  73.     } 
  74.      
  75.     class AsynMove extends AsyncTask<Integer, Integer, Void> { 
  76.  
  77.         @Override 
  78.         protected Void doInBackground(Integer... params) { 
  79.             int times; 
  80.             if (MAX_WIDTH % Math.abs(params[0]) == 0)// 整除 
  81.                 times = MAX_WIDTH / Math.abs(params[0]); 
  82.             else 
  83.                 times = MAX_WIDTH / Math.abs(params[0]) + 1;// 有余数 
  84.  
  85.             for (int i = 0; i < times; i++) { 
  86.                 publishProgress(params); 
  87.                 try
  88.                     Thread.sleep(Math.abs(params[0])); 
  89.                 } catch (InterruptedException e) { 
  90.                     // TODO Auto-generated catch block 
  91.                     e.printStackTrace(); 
  92.                 } 
  93.             } 
  94.             return null
  95.         } 
  96.  
  97.         @Override 
  98.         protected void onProgressUpdate(Integer... params) { 
  99.             LayoutParams lp = (LayoutParams)getLayoutParams(); 
  100.             if (params[0] < 0
  101.                 lp.rightMargin = Math.max(lp.rightMargin + params[0], -MAX_WIDTH); 
  102.             else 
  103.                 lp.rightMargin = Math.min(lp.rightMargin + params[0], 0); 
  104.  
  105.             if(lp.rightMargin==0 && onPanelStatusChangedListener!=null){//展开之后 
  106.                 onPanelStatusChangedListener.onPanelOpened(RightPanel.this);//调用OPEN回调函数 
  107.             } 
  108.             else if(lp.rightMargin==-MAX_WIDTH && onPanelStatusChangedListener!=null){//收缩之后 
  109.                 onPanelStatusChangedListener.onPanelClosed(RightPanel.this);//调用CLOSE回调函数 
  110.             } 
  111.             setLayoutParams(lp); 
  112.         } 
  113.     } 
  114.      
  115.     public interface OnPanelStatusChangedListener{ 
  116.         void onPanelOpened(RightPanel panel); 
  117.         void onPanelClosed(RightPanel panel); 
  118.     } 
  119.     private OnPanelStatusChangedListener onPanelStatusChangedListener; 
  120.     public void setOnPanelStatusChangedListener(OnPanelStatusChangedListener onPanelStatusChangedListener){ 
  121.         this.onPanelStatusChangedListener=onPanelStatusChangedListener; 
  122.     } 
  123.  
import android.content.Context;
import android.os.AsyncTask;
import android.view.View;
import android.widget.LinearLayout;

public class RightPanel extends LinearLayout{
	
	/**每次自动展开/收缩的范围*/
	private final static int SPEED=20;
	private int MAX_WIDTH=0;
	private Context mContext;

	/**
	 * viewBeside自动布局以适应Panel展开/收缩的空间变化
	 *
	 */	
	public RightPanel(Context context,View viewBeside,int width,int height) {
		super(context);
		this.mContext=context;
	
		//必须改变Panel左侧组件的weight属性
		LayoutParams p=(LayoutParams) viewBeside.getLayoutParams();
		p.weight=1;//支持挤压
		viewBeside.setLayoutParams(p);
		
		//设置Panel本身的属性
		LayoutParams lp=new LayoutParams(width, height);
		lp.rightMargin=-lp.width;
		MAX_WIDTH=Math.abs(lp.rightMargin);
		this.setLayoutParams(lp);
		
	}
	/**
	 * 
	 * @param context
	 * @param otherView
	 * @param width
	 * @param height
	 * @param bindView
	 * @param contentView
	 */
	public RightPanel(Context context,View viewBeside,int width,int height,View bindView,View contentView) {
		this(context,viewBeside,width,height);
		setBindView(bindView);
		setContentView(contentView);
	}
	
	/**
	 * 把View放在Panel中
	 * @param v
	 */
	public void setContentView(View v){
		this.addView(v);
	}
	
	/**
	 * 绑定触发动画的View
	 * @param bindView
	 */
	public void setBindView(View bindView){
		bindView.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				LayoutParams lp = (LayoutParams) getLayoutParams();
				if (lp.rightMargin < 0)// CLOSE的状态
					new AsynMove().execute(new Integer[] { SPEED });// 正数展开
				else if (lp.rightMargin >= 0)// OPEN的状态
					new AsynMove().execute(new Integer[] { -SPEED });// 负数收缩
			}
			
		});
	}
	
	class AsynMove extends AsyncTask<Integer, Integer, Void> {

		@Override
		protected Void doInBackground(Integer... params) {
			int times;
			if (MAX_WIDTH % Math.abs(params[0]) == 0)// 整除
				times = MAX_WIDTH / Math.abs(params[0]);
			else
				times = MAX_WIDTH / Math.abs(params[0]) + 1;// 有余数

			for (int i = 0; i < times; i++) {
				publishProgress(params);
				try {
					Thread.sleep(Math.abs(params[0]));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return null;
		}

		@Override
		protected void onProgressUpdate(Integer... params) {
			LayoutParams lp = (LayoutParams)getLayoutParams();
			if (params[0] < 0)
				lp.rightMargin = Math.max(lp.rightMargin + params[0], -MAX_WIDTH);
			else
				lp.rightMargin = Math.min(lp.rightMargin + params[0], 0);

			if(lp.rightMargin==0 && onPanelStatusChangedListener!=null){//展开之后
				onPanelStatusChangedListener.onPanelOpened(RightPanel.this);//调用OPEN回调函数
			}
			else if(lp.rightMargin==-MAX_WIDTH && onPanelStatusChangedListener!=null){//收缩之后
				onPanelStatusChangedListener.onPanelClosed(RightPanel.this);//调用CLOSE回调函数
			}
			setLayoutParams(lp);
		}
	}
	
	public interface OnPanelStatusChangedListener{
		void onPanelOpened(RightPanel panel);
		void onPanelClosed(RightPanel panel);
	}
	private OnPanelStatusChangedListener onPanelStatusChangedListener;
	public void setOnPanelStatusChangedListener(OnPanelStatusChangedListener onPanelStatusChangedListener){
		this.onPanelStatusChangedListener=onPanelStatusChangedListener;
	}

}


使用方法:
Java代码 复制代码 收藏代码
  1. import android.app.Activity; 
  2. import android.graphics.Color; 
  3. import android.os.Bundle; 
  4. import android.util.Log; 
  5. import android.view.Gravity; 
  6. import android.view.View; 
  7. import android.widget.Button; 
  8. import android.widget.LinearLayout; 
  9. import android.widget.TextView; 
  10. import android.widget.LinearLayout.LayoutParams; 
  11.  
  12. public class App extends Activity { 
  13.     public LeftPanel leftPanel; 
  14.     public RightPanel rightPanel; 
  15.     public LinearLayout container; 
  16.     public Button btn_0,btn_1; 
  17.     private View tv; 
  18.     public void onCreate(Bundle savedInstanceState) { 
  19.         super.onCreate(savedInstanceState); 
  20.         setContentView(R.layout.main); 
  21.         container=(LinearLayout)findViewById(R.id.container); 
  22.         btn_0 = (Button) findViewById(R.id.btn_0); 
  23.         btn_1 = (Button) findViewById(R.id.btn_1); 
  24.         tv = findViewById(R.id.tv); 
  25.          
  26.         //新建测试组件 
  27.         TextView content0=new TextView(this); 
  28.         content0.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); 
  29.         content0.setText("左边的panel"); 
  30.         content0.setGravity(Gravity.CENTER); 
  31.         content0.setTextColor(Color.RED); 
  32.         content0.setBackgroundColor(Color.WHITE); 
  33.          
  34.         //新建测试组件 
  35.         TextView content1=new TextView(this); 
  36.         content1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); 
  37.         content1.setText("右边的panel"); 
  38.         content1.setGravity(Gravity.CENTER); 
  39.         content1.setTextColor(Color.RED); 
  40.         content1.setBackgroundColor(Color.WHITE); 
  41.          
  42.         leftPanel=new LeftPanel(this,120,LayoutParams.FILL_PARENT); 
  43.         leftPanel.setBindView(btn_0); 
  44.         leftPanel.setContentView(content0); 
  45.         leftPanel.setOnPanelStatusChangedListener(new LeftPanel.OnPanelStatusChangedListener() { 
  46.              
  47.             @Override 
  48.             public void onPanelOpened(LeftPanel panel) { 
  49.                 // TODO Auto-generated method stub 
  50.                 Log.i("tag", "======onPanelOpened======="); 
  51.             } 
  52.              
  53.             @Override 
  54.             public void onPanelClosed(LeftPanel panel) { 
  55.                 // TODO Auto-generated method stub 
  56.                 Log.i("tag", "======onPanelClosed======="); 
  57.             } 
  58.         }); 
  59.          
  60.         container.addView(leftPanel,0);//加入Panel控件 
  61.         // 
  62.         rightPanel=new RightPanel(this,tv,120,LayoutParams.FILL_PARENT); 
  63.         rightPanel.setBindView(btn_1); 
  64.         rightPanel.setContentView(content1); 
  65.         rightPanel.setOnPanelStatusChangedListener(new RightPanel.OnPanelStatusChangedListener() { 
  66.              
  67.             @Override 
  68.             public void onPanelOpened(RightPanel panel) { 
  69.                 // TODO Auto-generated method stub 
  70.                 Log.i("tag", "======onPanelOpened======="); 
  71.             } 
  72.              
  73.             @Override 
  74.             public void onPanelClosed(RightPanel panel) { 
  75.                 // TODO Auto-generated method stub 
  76.                 Log.i("tag", "======onPanelClosed======="); 
  77.             } 
  78.         }); 
  79.         container.addView(rightPanel);//加入Panel控件 
  80.     } 
  81.  
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;

public class App extends Activity {
	public LeftPanel leftPanel;
	public RightPanel rightPanel;
	public LinearLayout container;
	public Button btn_0,btn_1;
	private View tv;
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		container=(LinearLayout)findViewById(R.id.container);
		btn_0 = (Button) findViewById(R.id.btn_0);
		btn_1 = (Button) findViewById(R.id.btn_1);
		tv = findViewById(R.id.tv);
		
		//新建测试组件
		TextView content0=new TextView(this);
		content0.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
		content0.setText("左边的panel");
		content0.setGravity(Gravity.CENTER);
		content0.setTextColor(Color.RED);
		content0.setBackgroundColor(Color.WHITE);
		
		//新建测试组件
		TextView content1=new TextView(this);
		content1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
		content1.setText("右边的panel");
		content1.setGravity(Gravity.CENTER);
		content1.setTextColor(Color.RED);
		content1.setBackgroundColor(Color.WHITE);
		
		leftPanel=new LeftPanel(this,120,LayoutParams.FILL_PARENT);
		leftPanel.setBindView(btn_0);
		leftPanel.setContentView(content0);
		leftPanel.setOnPanelStatusChangedListener(new LeftPanel.OnPanelStatusChangedListener() {
			
			@Override
			public void onPanelOpened(LeftPanel panel) {
				// TODO Auto-generated method stub
				Log.i("tag", "======onPanelOpened=======");
			}
			
			@Override
			public void onPanelClosed(LeftPanel panel) {
				// TODO Auto-generated method stub
				Log.i("tag", "======onPanelClosed=======");
			}
		});
		
		container.addView(leftPanel,0);//加入Panel控件
		//
		rightPanel=new RightPanel(this,tv,120,LayoutParams.FILL_PARENT);
		rightPanel.setBindView(btn_1);
		rightPanel.setContentView(content1);
		rightPanel.setOnPanelStatusChangedListener(new RightPanel.OnPanelStatusChangedListener() {
			
			@Override
			public void onPanelOpened(RightPanel panel) {
				// TODO Auto-generated method stub
				Log.i("tag", "======onPanelOpened=======");
			}
			
			@Override
			public void onPanelClosed(RightPanel panel) {
				// TODO Auto-generated method stub
				Log.i("tag", "======onPanelClosed=======");
			}
		});
		container.addView(rightPanel);//加入Panel控件
	}

}

main.xml:
Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" 
  6.     > 
  7.     <LinearLayout 
  8.         android:id="@+id/container" 
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent" 
  11.         android:orientation="horizontal" 
  12.         android:layout_weight="1" 
  13.         > 
  14.         <TextView  android:id="@+id/tv"  
  15.             android:layout_width="fill_parent" 
  16.             android:layout_height="fill_parent"  
  17.             android:gravity="center" 
  18.             android:text="hello,squeeze me." 
  19.             /> 
  20.     </LinearLayout> 
  21.     <LinearLayout 
  22.         android:layout_width="fill_parent"  
  23.         android:layout_height="wrap_content" 
  24.         android:orientation="horizontal" 
  25.         android:gravity="center" 
  26.         > 
  27.         <Button android:id="@+id/btn_0"  
  28.                 android:layout_width="wrap_content" 
  29.                 android:layout_height="wrap_content"  
  30.                 android:text="left" 
  31.                 /> 
  32.         <Button android:id="@+id/btn_1"  
  33.                 android:layout_width="wrap_content" 
  34.                 android:layout_height="wrap_content"  
  35.                 android:text="right" 
  36.                 /> 
  37.     </LinearLayout> 
  38. </LinearLayout> 

转自:http://gundumw100.iteye.com/blog/1183978

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值