您的位置:首页 > 产品设计 > UI/UE

Android系统UI设计之:Widget控件

2015-07-20 19:36 585 查看
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类,重写基本适配器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: