Android系统UI设计之:Widget控件

Widget控件

 [1]显示控件

     TextView文本控件           autoLink、visibility、textSize、textColor、background
     EditText可编辑的文本控件   hint、inputType
     ProgressBar进度条          max、progress
     ImageView显示图片的控件    src、scaleType

     WebView显示网页的控件

  [2]交互控件
     Button按钮                 enable
     checkBox多选按钮           checked
     radioButton单选按钮        checked

     seekBar可拖动的进度条      max、progress   监听接口 OnSeekBarChangeListener

package com.farsight.widget02;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class Android_10_Widget02Activity extends Activity implements
		OnClickListener, OnSeekBarChangeListener {
	CheckBox cb01;
	CheckBox cb02;
	CheckBox cb03;

	TextView tv;

	String s01 = "";
	String s02 = "";
	String s03 = "";
	
	TextView tvProgress;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		cb01 = (CheckBox) findViewById(R.id.checkBox1);
		cb02 = (CheckBox) findViewById(R.id.checkBox2);
		cb03 = (CheckBox) findViewById(R.id.checkBox3);
		tv = (TextView) findViewById(R.id.tv1);
		
		check();

		cb01.setOnClickListener(this);
		cb02.setOnClickListener(this);
		cb03.setOnClickListener(this);
		
		SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar1);
		seekBar.setOnSeekBarChangeListener(this);
		
		tvProgress = (TextView) findViewById(R.id.tv2);
		tvProgress.setText(String.valueOf(seekBar.getProgress()));
		
		
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		
		check();
		
	}

	private void check() {
		if (cb01.isChecked()) {
			s01 = cb01.getText().toString();
		} else {
			s01 = "";
		}
		if (cb02.isChecked()) {
			s02 = cb02.getText().toString();
		} else {
			s02 = "";
		}
		if (cb03.isChecked()) {
			s03 = cb03.getText().toString();
		} else {
			s03 = "";
		}
		tv.setText(s01 + " " + s02 + " " + s03);
	}

	
	//当用户在拖动进度条时,调用该方法
	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {
		// TODO Auto-generated method stub
		Log.e("Test", "move");
		tvProgress.setText(String.valueOf(progress));
	}

	//当用户点击进度条时,调用该方法
	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
		// TODO Auto-generated method stub
		
		Log.e("Test", "start");
	}

	//当用户松开进度条时,调用该方法
	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		// TODO Auto-generated method stub
		Log.e("Test", "stop");
		
	}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="music" />

    <CheckBox
        android:id="@+id/checkBox2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="coding" />

    <CheckBox
        android:id="@+id/checkBox3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="read"
        android:checked="true" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="coding"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="woman" />

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="man" />

    </RadioGroup>

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:max="100"
        android:progress="50"/>

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="当前进度:"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_selector"/>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large TextLarge TextLarge Text"
        android:textAppearance="?android:attr/textAppearanceLarge" 
        android:background="@drawable/chat_bubble_red"/>

</LinearLayout>
运行效果如下:

  [3]容器控件

    1. LinearLayout线性布局 

       oritation:         布局的方向 vitical,horizental
       gravity/padding     重心/内间距
       layout_gravity/layout_margin     相对重心/外间距
       layout_weight       权重  对剩余空间的分配

<?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" >

    <!-- 嵌套布局 -->
    
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:background="#FFF">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

    </LinearLayout>

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
<?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" 
    android:gravity="right"
    android:paddingRight="50dp"
    android:paddingTop="20dp">

    <!-- gravity重心: 指控件内容相对于控件的位置,一共9个方位 -->
    <!-- 默认 left|top , 其它分别是  right|top, right|bottom, center_vertical|right ... -->
    <!-- padding内间距:配合重心使用,对位置进行微调。例如重心为right|top,那么只收到paddingRight 和 paddingTop的影响 -->
    
    <Button
        android:id="@+id/button1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:gravity="right"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>
<?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" >

    <!-- layout_gravity相对重心 : 指当前控件相对于父控件的位置-->
    <!-- 相对重心受到父控件orientation的影响 -->
    <!-- 如果父控件的orientation为vertical,那么相对重心只有left center_horizental right -->
    <!-- 如果父控件的orientation为horizontal,那么相对重心只有top center_vertical bottom -->
   
    <!-- layout_margin外间距配合相对重心使用,对位置进行微调。 -->
    <!-- 例如相对重心为right,那么外间距一定是marginRight -->
   
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" 
        android:layout_gravity="right"
        android:layout_marginRight="20dp"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>
<?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="horizontal" >

    <!-- layout_weight权重:可以对剩余空间进行分配 -->
    
    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Btn" 
        android:layout_weight="1"
        />

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button02" 
        android:layout_weight="1"/>

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

    <!-- 布局方向 orientation : 1.vertical垂直  2.horizontal水平 -->
    
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

    2. RelativeLayout相对布局  

       当前控件相对于父控件的位置      layout_alignParent  
       当前控件相对于其它控件的位置    layout_above  / layout_alignLeft
       位置的微调                      layout_margin

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

    <!-- 当前控件相对于父控件的位置   9个位置  配合layout_margin进行微调-->
    <!-- 默认在左上 -->
    
    <!-- 没有该属性   layout_gravity -->
    
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
   
        android:text="Button" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="Button" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Button" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Button" />

    <Button
        android:id="@+id/button6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:text="Button" />

    <Button
        android:id="@+id/button7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:text="Button" />

    <Button
        android:id="@+id/button8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:text="Button" />

    <Button
        android:id="@+id/button9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="10dp"
        android:text="Button" />

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

    <!-- 当前控件相对于其它控件的位置 -->
    <!-- 当前控件在其它控件的上方 layout_above, 下方layout_below, 左方layout_toLeftOf, 右方layout_toRightOf-->
    <!-- 当前控件和其它控件边缘对齐layout_alignTop, layout_alignBottom, layout_alignRight, layout_alignLeft, layout_alignBaseLine基线对齐 -->

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="57dp"
        android:layout_marginTop="54dp"
        android:text="Button01" />

    <!-- maginTop 指 按钮2上方距离按钮1有20dp -->
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
   		android:layout_below="@id/button1"
   		android:layout_alignLeft="@id/button1"
   		android:layout_marginTop="20dp"
        android:text="Button02" />

</RelativeLayout>
效果如下:


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

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       	android:layout_centerInParent="true"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button1"
        android:layout_toLeftOf="@+id/button1"
        android:text="Button" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       	android:layout_above="@id/button1"
       	android:layout_toRightOf="@id/button1"
        android:text="Button" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_toLeftOf="@+id/button1"
        android:text="Button" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button1"
        android:layout_toRightOf="@id/button1"
        android:text="Button" />

</RelativeLayout>
实战项目(我们约会吧登陆界面)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/back" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="22dp"
        android:layout_marginTop="156dp"
        android:text="账号:"
        android:textColor="#000000"
        android:textSize="25dp" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="216dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_toRightOf="@+id/textView1" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/editText1"
        android:text="密码:"
        android:textColor="#000000"
        android:textSize="25dp" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="216dp"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_centerVertical="true"
        android:inputType="textPassword" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/editText1"
        android:src="@drawable/log" />

    <CheckBox
        android:id="@+id/checkBox2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/editText2"
        android:layout_below="@+id/editText2"
        android:text="自动登陆"
        android:textColor="#000000" />

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/editText2"
        android:text="记住密码"
        android:textColor="#000000" />

    <Button
        android:id="@+id/button1"
        android:layout_width="275dp"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/checkBox1"
        android:layout_below="@+id/checkBox1"
        android:layout_centerHorizontal="true"
        android:text="登陆" />

    <CheckedTextView
        android:id="@+id/checkedTextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button1"
        android:textColor="#000000"
        android:text="用户注册" />

    <CheckedTextView
        android:id="@+id/checkedTextView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/checkedTextView1"
        android:layout_alignBottom="@+id/checkedTextView1"
        android:layout_centerHorizontal="true"
        android:textColor="#000000"
        android:text="匿名登陆" />

    <CheckedTextView
        android:id="@+id/checkedTextView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/checkBox2"
        android:layout_below="@+id/button1"
        android:textColor="#000000"
        android:text="退出系统" />


    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/checkedTextView1"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="16dp"
        android:text="Copyright © 2004-2015,farsight.com,All Rights Reserved"
        android:textColor="#000000" />

</RelativeLayout>
效果如下:


    3. FrameLayout帧布局

       layout_gravity
     (绝对布局,表格布局,已被淘汰)   

     4.ListView列表视图

  [1]ListView 由一行一行的控件组成,每一行称为ListView的item项。
  [2]Adapter
     适配器Adapter概念:控制ListView中显示的内容和布局
     适配器Adapter分类:1.系统提供的适配器
                          ArrayAdapter数组适配器    ---- 用来显示简单布局
                          SimpleAapter简单的适配器  ---- 用来显示复杂布局
                          SimpleCursorAdapter       ---- 用来显示数据库中的记录
  [3]ListView的item项的监听接口 OnItemClickListenner

package com.farsight.listview01;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class Android_12_ListView01Activity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		ListView listView = (ListView) findViewById(R.id.listView1);

		// String texts[] = { "01", "02", "03", "04", "05", "06", "07", "08",
		// "09", "10" };
		// // 数组适配器
		// // 适配器中需要指定两个内容:1.显示的数据 2.布局文件
		// ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
		// android.R.layout.simple_list_item_1, texts);

		// 文字内容
		String texts[] = { "01", "02", "03", "04" };
		// 图片内容
		int imageIds[] = { R.drawable.ic_launcher, R.drawable.emoticon_02,
				R.drawable.emoticon_03, R.drawable.emoticon_04 };
		// 将文字内容和图片内容放入链表中
		ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < imageIds.length; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("text", texts[i]);
			map.put("imageId", imageIds[i]);
			data.add(map);
		}

		SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item,
				new String[] { "text", "imageId" }, new int[] { R.id.textView1,
						R.id.imageView1 });

		// 绑定适配器
		listView.setAdapter(adapter);

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

   

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
        
    </ListView>

    

</LinearLayout>
效果如下:


<?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"
  >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
效果如下:

运行效果如下:

实战项目:制作出如下图所示布局:

package com.farsight.listview02;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class Android_13_ListView02Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ListView listView = (ListView) findViewById(R.id.listView1);
        
        int imageIds[] = {R.drawable.emoticon_02, R.drawable.emoticon_03, R.drawable.emoticon_04};
        double bookPrices[] = {99.99, 87.99, 99.00};
        String bookNames[] = {"java", "c++", "c#"};
        
        
        //ctrl + shift + o 快速导包
        ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
        for (int i = 0; i < bookPrices.length; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("imageId", imageIds[i]);
			map.put("name", bookNames[i]);
			map.put("price", bookPrices[i]);
			data.add(map);
		}
        
        SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item, 
        		new String[]{"imageId", "price", "name"}, new int[]{R.id.imageView1, R.id.textView2, R.id.textView1});
    
        listView.setAdapter(adapter);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:layout_weight="1">
    </ListView>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="购买" 
        android:layout_gravity="right"/>

</LinearLayout>
效果如下:


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

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
      	android:layout_marginLeft="30dp"
        android:orientation="vertical" 
        android:gravity="center_horizontal">

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />
        
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp" >

        <Button
            android:id="@+id/button1"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:text="-" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <Button
            android:id="@+id/button2"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:text="+" />

    </LinearLayout>

</RelativeLayout>
效果如下:


  [4]自定适配器的步骤
     (1)定义类继承BaseAdapter
     (2)在BaseAdapter的子类中,需要声明三个属性:1.item布局文件的索引  
                                                2.数据(链表或者数组) 
                                                3.布局加载器(LayoutInflater inflater = LayoutInflate.from(context))
                                                  功能:解析item项的布局,生成item项的视图对象
                                                        View view = inflater.inflate(id, null);
     (3)重写四个方法:1.getCount()                      系统调用该方法,得到item项的数量,item项数量取决于链表(数组)的长度
                     2.getItem(int position)           系统调用该方法,得到第position项的数据对象
                     3.getItemId(int position)         系统调用该方法,得到item的id号
                     4.getView(int position, ..., ...) 系统调用该方法,得到第position项的视图对象
                       在控件上绑定数据
     (4)如果用户修改ListView上显示的数据,那么需要使用adapter.notifyDataSetChanged方法刷新适配器,更新视图对象。
       用户在调用notifyDataSetChanged方法时,系统会自动调用getView方法。

案例一:

package com.farsight.baseadapter01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

public class Android_15_BaseAdapter01Activity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		ListView listView = (ListView) findViewById(R.id.listView1);

		MyItemData data[] = {new MyItemData("01", "btn01"), new MyItemData("02", "btn02")};
//		// 使用自定义适配器
//		// 1.自定义类继承BaseAdapter。(BaseAdapter为所有适配器的父类)
		MyAdapter adapter = new MyAdapter(this, R.layout.item, data);
		Log.e("Test", "listView = " + listView);
		Log.e("Test", "adapter = " + adapter);
		
		listView.setAdapter(adapter);

	}
}
package com.farsight.baseadapter01;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

	//1.item项的布局文件
	//2.每个item项显示的数据
	
	int id;
	MyItemData[] data;
	
	//布局加载器
	//功能:解析布局文件,生成视图view对象
	//布局加载器工具对象从上下文中取出
	LayoutInflater inflater;
	
	
	public MyAdapter(Context context, int id, MyItemData data[]) {
		// TODO Auto-generated constructor stub
		this.id = id;
		this.data = data;
		this.inflater = LayoutInflater.from(context);
	}
	
	//系统自动调用该方法,需要知道listView中item项的数量
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return data.length;
	}

	//系统自动调用该方法,需要得到第position的item项的数据对象
	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return data[position];
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	//系统自动调用该方法,得到第position项的视图对象
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		
		//解析布局文件,生成视图对象
		View view = inflater.inflate(id, null);
		TextView tv = (TextView) view.findViewById(R.id.textView1);
		tv.setText(data[position].getTextViewData());
		Button btn = (Button) view.findViewById(R.id.button1);
		btn.setText(data[position].getButtonData());
		
		return view;
	}

}
案例二:
package com.farsight.baseadapter02;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ListView;

public class Android_16_BaseAdapter02Activity extends Activity implements OnClickListener {
    Book book01 = new Book(R.drawable.emoticon_02, "java", 99.99, 3);
    Book book02 = new Book(R.drawable.emoticon_03, "c++", 88.99, 1);
    Book book03 = new Book(R.drawable.emoticon_04, "c#", 99.00, 1);
    Book books[] = {book01, book02, book03};
    
    String bookNames[] = new String[3];
    double bookPrices[] = new double[3];
    int bookNumbers[] = new int[3];
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ListView listView = (ListView) findViewById(R.id.listView1);
        
        
        MyAdapter adapter = new MyAdapter(this, books, R.layout.item);
        
        listView.setAdapter(adapter);
        
        findViewById(R.id.button1).setOnClickListener(this);
    }

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		for (int i = 0; i < bookNames.length; i++) {
			bookNames[i] = books[i].getName();
			bookPrices[i] = books[i].getPrice();
			bookNumbers[i] = books[i].getNumber();
		}
		
		Intent intent = new Intent(this, PayActivity.class);
		intent.putExtra("name", bookNames);
		intent.putExtra("price", bookPrices);
		intent.putExtra("number", bookNumbers);
		startActivity(intent);
		
	}
}
package com.farsight.baseadapter02;

public class Book {
	private int imageId;
	private String name;
	private double price;
	private int number;

	public Book(int imageId, String name, double price, int number) {
		super();
		this.imageId = imageId;
		this.name = name;
		this.price = price;
		this.number = number;
	}

	public int getImageId() {
		return imageId;
	}

	public void setImageId(int imageId) {
		this.imageId = imageId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public void subNumber(){
		if(this.number > 1)
			this.number--;
	}
	
	public void addNumber(){
		this.number++;
	}
	
}
package com.farsight.baseadapter02;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

	int id;
	Book books[];
	
	LayoutInflater inflater;
	
	public MyAdapter(Context context, Book books[], int id) {
		// TODO Auto-generated constructor stub
		this.inflater = LayoutInflater.from(context);
		this.books = books;
		this.id = id;
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		Log.e("Test", "count = " + books.length);
		return books.length;
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return books[position];
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		View view = inflater.inflate(R.layout.item, null);
		Log.e("Test", "view " + position);
		ImageView imageView = (ImageView) view.findViewById(R.id.imageView1);
		imageView.setImageResource(books[position].getImageId());
		TextView tvName = (TextView) view.findViewById(R.id.textView1);
		tvName.setText(books[position].getName());
		TextView tvPrice = (TextView) view.findViewById(R.id.textView2);
		tvPrice.setText(String.valueOf(books[position].getPrice()));
		TextView tvNumber = (TextView) view.findViewById(R.id.textView3);
		tvNumber.setText(String.valueOf(books[position].getNumber()));
		
		Button btnSub = (Button) view.findViewById(R.id.button1);
		btnSub.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Book book = books[position];
				book.subNumber();
				
				//刷新适配器
				//系统自动调用getView方法
				notifyDataSetChanged();
			}
		});
		
		Button btnAdd = (Button) view.findViewById(R.id.button2);
		btnAdd.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				books[position].addNumber();
				notifyDataSetChanged();
			}
		});
		
		
		return view;
	}

}
package com.farsight.baseadapter02;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class PayActivity extends Activity implements OnItemClickListener {

	ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
	SimpleAdapter adapter;
	TextView tvPrice;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_pay);

		ListView listView = (ListView) findViewById(R.id.listView1);
		tvPrice = (TextView) findViewById(R.id.textView2);
		
		Intent intent = this.getIntent();
		String names[] = intent.getStringArrayExtra("name");
		double prices[] = intent.getDoubleArrayExtra("price");
		int number[] = intent.getIntArrayExtra("number");

		for (int i = 0; i < number.length; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("name", names[i]);
			map.put("number", number[i]);
			map.put("price", prices[i]);
			data.add(map);
		}
		
		adapter = new SimpleAdapter(this, data,
				R.layout.pay_item, new String[] { "name", "number" },
				new int[] { R.id.textView1, R.id.textView2 });
		
		listView.setAdapter(adapter);
		
		
		
		tvPrice.setText("总价:" + getPrice());

		listView.setOnItemClickListener(this);
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		// TODO Auto-generated method stub
		
		//删除用户点击的item项的数据对象
		data.remove(arg2);
		//刷新适配器
		adapter.notifyDataSetChanged();
		
		tvPrice.setText("总价:" + getPrice());
	}
	
	private double getPrice(){
		double priceAll = 0;
		for (int i = 0; i < data.size(); i++) {
			HashMap<String, Object> map = data.get(i);
			double price = Double.parseDouble(map.get("price").toString());
			int number = Integer.parseInt(map.get("number").toString());
			priceAll += price*number;
		}
		
		return priceAll;
	}
}

5.GridView 网格视图

    一格为一个item项。使用适配器填充内容。
  使用方式和ListView完全相同。例如适配器,监听接口等等。
  属性:numColumns 列数

6.对话框和Menu,详见代码

对话框:

package com.farsight.dialog;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;

public class Android_18_DialogActivity extends Activity implements
		OnClickListener {
	
	TextView tvInfo;
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);
	
		tvInfo = (TextView) findViewById(R.id.textView1);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v.getId() == R.id.button1) {

			// 导入AlertDialog下的Builder
			Builder builder = new Builder(this);

			builder.setTitle("退出");
			builder.setMessage("是否退出当前应用程序");
			builder.setPositiveButton("确定",
					new DialogInterface.OnClickListener() {

						// 当用户点击对话框按钮时,系统调用该方法
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							finish();
						}
					});
			builder.setNegativeButton("取消", null);

			builder.create(); // 创建对话框
			builder.show(); // 显示对话框
		} else if (v.getId() == R.id.button2) {
			Builder builder = new Builder(this);

			builder.setTitle("注册");
			final View view = LayoutInflater.from(this).inflate(
					R.layout.dialog, null);
			// 设置对话框正文视图
			builder.setView(view);
			builder.setPositiveButton("确定",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							EditText etUser = (EditText) view
									.findViewById(R.id.editText1);
							EditText etPass = (EditText) view
									.findViewById(R.id.editText2);
							
							String user = etUser.getText().toString();
							String pass = etPass.getText().toString();
							
							tvInfo.setText(user + ":" + pass);
						}
					});
			builder.setNegativeButton("取消", null);
			builder.create();
			builder.show();

		}
	}
}
<?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" >

     <LinearLayout
            android:id="@+id/linearLayout2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="账号"
                android:textAppearance="?android:attr/textAppearanceLarge"
               />

            <EditText
                android:id="@+id/editText1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1" >

                <requestFocus />
            </EditText>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/linearLayout3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="密码"
                android:textAppearance="?android:attr/textAppearanceLarge"
                />

            <EditText
                android:id="@+id/editText2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textPassword" />
        </LinearLayout>

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

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="退出" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注册" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
Menu:

package com.farsight.menu;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;

public class Android_19_MenuActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    //用户点击menu按钮时,系统自动调用该方法,创建选项菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	// TODO Auto-generated method stub
    	//添加子菜单
    	SubMenu subMenu01 = menu.addSubMenu(1, 1, 10, "选项一");
    	//向选项一添加二级菜单
    	subMenu01.add("01");
    	subMenu01.add("02");
    	subMenu01.add("03");
    	
    	menu.addSubMenu(1, 2, 2, "选项二");
    	menu.addSubMenu(1, 3, 3, "退出");
    	
    	return super.onCreateOptionsMenu(menu);
    }
    
    //用户点击菜单项时调用
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	// TODO Auto-generated method stub
    	if(item.getItemId() == 3){
    		finish();
    	}
    	
    	return super.onOptionsItemSelected(item);
    	
    }
}


7.特殊控件
     Toast温馨提示  AlertDialog对话框  Menu菜单
8.自定义控件

     继承View类,重写onDraw方法

package com.farsight.myview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View implements Runnable {

	// 画笔对象
	Paint paint = new Paint();

	// 位图对象
	Bitmap bitmap;

	int speed = 10;
	int rectX = 40;
	
	int bitmapX = 0;
	int bitmapY = 0;
	int bitmapWidth;
	int bitmapHeight;

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub

		// 载入图片资源,生成位图对象
		bitmap = BitmapFactory.decodeResource(context.getResources(),
				R.drawable.emoticon_04);

		//得到图片宽
		bitmapWidth = bitmap.getWidth();
		//得到图片的高
		bitmapHeight = bitmap.getHeight();
		
		new Thread(this).start();
	}

	// canvas画布对象
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		// 得到自定义控件的宽高
		// this.getWidth();
		// this.getHeight();

		// 设置画布颜色
		canvas.drawColor(Color.WHITE);
		// 设置画笔颜色
		paint.setColor(Color.BLACK);
		// 画线
		canvas.drawLine(20, 20, 140, 20, paint);

		// 画矩形
		paint.setStyle(Style.FILL);
		canvas.drawRect(rectX, 40, 60 + rectX, 100, paint);

		// 改变矩形x轴坐标
		// 移动矩形
		rectX += speed;
		// 修正
		if (rectX + 60 > this.getWidth()) {
			rectX = this.getWidth() - 60;
		}

		// 设置画笔的样式:空心(stroke),实心(fill)。默认实心。
		// 设置为空心画笔
		paint.setStyle(Style.STROKE);
		canvas.drawRect(120, 120, 200, 200, paint);

		// 消除锯齿
		paint.setAntiAlias(true);
		// 画圆
		canvas.drawCircle(150, 150, 60, paint);

		// 绘制位图
		canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint);
	}

	//用户触摸到图片
	boolean isOnBitmap;
	int subX, subY;
	// 当用户触摸到该控件,系统自动调用该方法
	// 参数event为触摸事件
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub

		// 得到用户触摸点坐标
		int x = (int) event.getX();
		int y = (int) event.getY();
		Log.e("Test", "(" + x + "," + y + ")");
		// 得到用户触摸动作
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			// 按下
			if(x >= bitmapX  && x <= bitmapX+bitmapWidth
					&& y >= bitmapY && y <= bitmapY+bitmapHeight){
				isOnBitmap = true;
				subX = x-bitmapX;
				subY = y-bitmapY;
			}
		}
		if (event.getAction() == MotionEvent.ACTION_UP) {
			// 松开
			Log.e("Test", "action_up");
			isOnBitmap = false;
		}
		if (event.getAction() == MotionEvent.ACTION_MOVE) {
			// 滑动
			if(isOnBitmap){
				bitmapX = x-subX;
				bitmapY = y-subY;
			}
		}

		return true;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {

			// 当用户调用此方法,系统会自动调用onDraw方法
			this.postInvalidate();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}


容器控件:
1.布局控件
  [1]线性布局LinearLayout:orientation
  graviy, padding    (gravity重心: 指控件内容相对于控件的位置,一共9个方位 -->
    <!-- 默认 left|top , 其它分别是  right|top, right|bottom, center_vertical|right ... -->
    <!-- padding内间距:配合重心使用,对位置进行微调。例如重心为right|top,那么只收到paddingRight 和 paddingTop的影响 -->)


                           layout_gravity, layout_margin  (<!-- layout_gravity相对重心 : 指当前控件相对于父控件的位置-->
    <!-- 相对重心受到父控件orientation的影响 -->
    <!-- 如果父控件的orientation为vertical,那么相对重心只有left center_horizental right -->例如
    <!-- 如果父控件的orientation为horizontal,那么相对重心只有top center_vertical bottom -->
   
    <!-- layout_margin外间距配合相对重心使用,对位置进行微调。 -->
    <!-- 例如相对重心为right,那么外间距一定是marginRight -->)
                           layout_weight  权重,对剩下的空间进行分配


  [2]相对布局RelativeLayout:相对于父控件位置:layout_alignPrent... 有9个位置(layout_centerVertical="true"、layout_alignParentRight、layout_centerHorizontal、layout_centerInParent、layout_alignParentBottom、layout_alignParentLeft、layout_alignParentTop),配合layout_margin进行微调
                             相对于其它控件位置:方 layout_above, 下方layout_below, 左方layout_toLeftOf, 右方layout_toRightOf
                             边缘对齐:layout_alignTop, layout_alignBottom, layout_alignRight, layout_alignLeft, layout_alignBaseLine基线对齐,例如:layout_alignLeft="@id/button1"
  [3]帧布局FrameLayout:layout_gravity(不受任何限制), layout_margin   分层的布局


  [4]布局使用的方式:三种布局灵活组合嵌套使用。


容器控件 -------(重点)
  [1]ListView 列表视图
  [2]适配器Adapter概念:控制ListView中显示的内容和布局
  [3]适配器Adapter分类:1.系统适配器
                           ArrayAdapter   用来显示简单布局
                           SimpleAdapter  用来显示复杂布局
                           SimpleCursorAdapter 用来显示数据库中的记录
                         2.自定义适配器
                           继承BaseAdapte类,重写基本适配器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值