Dialog 對話框,它運行起來的效果是什麼樣呢?如下圖
這種是最常用的對話框
當點擊瞭上圖的確定後,會彈此對話框,這種對話框屬於自定義佈局類型
當執行一些比較費時的操作時,用這種對話框是個不錯的選擇
當我們需要用戶進行選擇操作,又不能使用下來列表時,可以使用這種自定義佈局的對話框
接下來我們就一起來看看這些通過代碼是如何實現的?
package TSD.Jason.Example;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
/**
* 對話框
* @author Administrator
* 常用方法:
* setTitle():給對話框設置title.
setIcon():給對話框設置圖標。
setMessage():設置對話框的提示信息
setItems():設置對話框要顯示的一個list,一般用於要顯示幾個命令時
setSingleChoiceItems():設置對話框顯示一個單選的List
setMultiChoiceItems():用來設置對話框顯示一系列的復選框。
setPositiveButton():給對話框添加”Yes”按鈕。
setNegativeButton():給對話框添加”No”按鈕。
*
*/
public class DialogActivity extends Activity {
Button btn1;
ProgressDialog p;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diaolg);
btn1 = (Button)findViewById(R.id.btnDialog);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Builder dialog = new AlertDialog.Builder(DialogActivity.this);
dialog.setTitle("登錄提示");
dialog.setIcon(android.R.drawable.ic_dialog_info);
dialog.setMessage("是否登錄?");
dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ShowLoginDialog();
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DialogActivity.this.finish();
}
});
dialog.show();
}
});
}
}
以上代碼是我們第一張對話框的效果實現代碼,大傢發現是不是挺簡單,當我們單擊確定按鈕後,將調用一個叫做ShowLoginDialog的方法。
這個方法馬上會貼出來,在這裡我還是要強調下,大傢在寫代碼的時候一定要有一個良好的編程思想,將功能拆分,降低代碼的耦合度,一個方法隻做一件事情,不要一股腦的將代碼寫到一個方法裡。希望大傢記得。
private void ShowLoginDialog()
{
Builder builder = new AlertDialog.Builder(DialogActivity.this);
builder.setTitle("用戶登錄");
LayoutInflater factory = LayoutInflater.from(DialogActivity.this);
View dialogView = factory.inflate(R.layout.dialogview, null);
builder.setView(dialogView);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DialogWait();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DialogActivity.this.finish();
}
});
builder.show();
}
上邊被標註的代碼是為瞭讓Dialog中的內容部分顯示我們自定義的佈局文件,通過builder對象的setView方法就可以將R.layout.dialogview這個佈局文件綁定到對話框中。
佈局文件代碼如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="賬號"
/>
<EditText
android:id="@+id/txtUserName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請輸入賬號"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="密碼"
/>
<EditText
android:id="@+id/txtUserPwd"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:password="true"
android:hint="請輸入密碼"
/>
</LinearLayout>
第三個等待效果的對話框是如何實現的呢?上邊我們調用瞭一個方法叫做DialogWait
private void DialogWait()
{
p = ProgressDialog.show(DialogActivity.this, "正在登錄", "請稍後…", true);
new Thread(){
public void run(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
p.dismiss();//登錄結束後,取消對話框
}
}
}.start();
}
大傢註意,此時的類就不在是AlertDialog,而是ProgressDialog。
上邊代碼我們為瞭測試看效果,所以開啟瞭一個線程,並掛起2秒,這在以後項目中是不需要的,如果大傢看不太懂,那麼這裡先跳過。
接下來我們來看看如何在對話框中嵌套一個ListView。
首先,需要一個佈局文件,佈局文件裡隻創建一個ListView,如下代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:scrollbars="vertical">
<ListView
android:id="@+id/listCity"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"/>
</LinearLayout>
Java代碼如下
private void ShowLoginDialog()
{
Builder builder = new AlertDialog.Builder(Tab1Activity.this);
builder.setTitle("選擇城市");
LayoutInflater factory = LayoutInflater.from(Tab1Activity.this);
View dialogView = factory.inflate(R.layout.dialogcity, null);
listCity =(ListView)dialogView.findViewById(R.id.listCity);
GetCity();
builder.setView(dialogView);
builder.show();
}
private void GetCity()
{
System.out.println("asd");
ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>();
HashMap<String, String> hmItem = new HashMap<String, String>();
hmItem.put("city", "北京");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "上海");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "深圳");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "天津");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "南京");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "武漢");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "江蘇");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("city", "寧波");
listData.add(hmItem);
SimpleAdapter sim = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, new String[]{"city"}, new int[]{android.R.id.text1});
listCity.setAdapter(sim);
}
直接調用ShowLoginDialog方法即可。註意標註的代碼,需要先獲取ListView。這裡已經用到瞭ListView,如果不太懂下邊就將ListView,大傢註意看。
ListView
上邊已經展示過它運行的效果瞭,這裡就不展示運行效果瞭。
那麼要使用ListView需要哪些步驟呢?舉一個例子,可能不太恰當
冰箱裡沒有雞蛋瞭,我們從傢裡提瞭一個籃子去超市買雞蛋。就是這樣的一個過程。我們來分解下這個步驟
冰箱== 展示數據== ListView
超市裡的雞蛋== 數據== ArrayList<E> 泛型集合
籃子== 適配器== SimpleAdapter
我們應該將 雞蛋(ArrayList<E>) 裝到 籃子裡(SimpleAdapter) 然後提回傢 放到 冰箱裡(ListView)
分解完步驟後,那麼我們看看如何用代碼實現這個過程。
ListView userList; //聲明一個ListView對象(冰箱)
userList = (ListView)findViewById(R.id.listUserInfo); //獲取佈局文件中的ListView控件賦值給ListView對象
ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>(); //數據源 (超市裝雞蛋的盒子)
HashMap<String, String> hmItem = new HashMap<String, String>(); //需要一個HashMap鍵值對 (每一個雞蛋)
hmItem.put("userName", "張三");
hmItem.put("userPhone", "1234567890");
listData.add(hmItem); //將雞蛋裝到數據源中
String[] s = new String[2]; //列 和鍵值對中的鍵 一一對應 每個鍵值對應該是一樣的列數
s[0] = "userName";
s[1] = "userPhone";
int[] i = new int[2]; //用什麼控件來裝載上邊String集合中的列 和上邊的String數組也是一一對應的
i[0] = android.R.id.text1;
i[1] = android.R.id.text2;
SimpleAdapter sim = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, s, i); //這就是我們的籃子
userList.setAdapter(sim); //將籃子中的雞蛋裝到冰箱中:)
完整的代碼如下
package TSD.Jason.Example;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
* ListView基本使用方法
*
* 使用ListView的基本步驟
* 1.準備ListView要顯示的數據 ;
* ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>();
*
* 2.使用 一維或多維 動態數組 保存數據;
* HashMap<String, String> hmItem = new HashMap<String, String>();
hmItem.put("userName", "張三");
hmItem.put("userPhone", "1234567890");
* 3.構建適配器 , 簡單地來說, 適配器就是Item數組 , 動態數組 有多少元素就生成多少個Item;
* SimpleAdapter simpleAdapter;
* 數據綁定的類
* 參數解釋
*
* 第一個context,很明顯大傢根據英文可以知道是上下文的意思,它官方的意思是:SimpleAdapter所要運行關聯到的視圖,這個是什麼呢?就是你這個SimpleAdapter所在的Activity(一般而言),所以這個參數一般是this
第二個是一個泛型隻要是一個List就行,這一般會想到是ArrayList,而他內部存儲的則是Map或者繼承自Map的對象,比如HashMap,這些語法都是Java的基本語法,不再詳述瞭!這裡呢是作為數據源,而且每一個ArraList中的一行就代表著呈現出來的一行,Map的鍵就是這一行的列名,值也是有列名的。
第三個資源文件,就是說要加載這個兩列所需要的視圖資源文件,你可以左邊一個TextView右邊一個TextView,目的在於呈現左右兩列的值!
第四個參數是一個數組,主要是將Map對象中的名稱映射到列名,一一對應
第五個是將第四個參數的值一一對象的顯示(一一對應)在接下來的int形的id數組中,這個id數組就是LayOut的xml文件中命名id形成的唯一的int型標識符
* context 關聯SimpleAdapter運行著的視圖的上下文。
data 一個Map的列表。在列表中的每個條目對應列表中的一行,應該包含所有在from中指定的條目
resource 一個定義列表項目的視圖佈局的資源唯一標識。佈局文件將至少應包含哪些在to中定義瞭的名稱。
from 一個將被添加到Map上關聯每一個項目的列名稱的列表
to 應該在參數from顯示列的視圖。這些應該全是TextView。在列表中最初的N視圖是從參數from中最初的N列獲取的值。
*
* 4.把 適配器 添加到ListView,並顯示出來。
* @author Administrator
*
*/
public class ListViewActivity extends Activity {
ListView userList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
userList = (ListView)findViewById(R.id.listUserInfo);
ArrayList<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>();
HashMap<String, String> hmItem = new HashMap<String, String>();
hmItem.put("userName", "張三");
hmItem.put("userPhone", "1234567890");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("userName", "李四");
hmItem.put("userPhone", "981234502");
listData.add(hmItem);
hmItem = new HashMap<String, String>();
hmItem.put("userName", "王五");
hmItem.put("userPhone", "5622435566221");
listData.add(hmItem);
//SimpleAdapter simpleAdapter = new SimpleAdapter(this, listData, R.layout.textviewitem, new String[]{"userName","userPhone"}, new int[]{R.id.txtUserName,R.id.txtUserPhone});
//SimpleAdapter simpleAdapter = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, new String[]{"userName","userPhone"}, new int[]{android.R.id.text1,android.R.id.text2});
//SimpleAdapter simpleAdapter = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_2, new String[]{"userName","userPhone"}, new int[]{android.R.id.text1,android.R.id.text2});
String[] s = new String[2];
s[0] = "userName";
s[1] = "userPhone";
int[] i = new int[2];
i[0] = android.R.id.text1;
i[1] = android.R.id.text2;
SimpleAdapter sim = new SimpleAdapter(this, listData, android.R.layout.simple_list_item_1, s, i);
userList.setAdapter(sim);
//列表項單擊事件
userList.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
System.out.println(arg2);
System.out.println(arg3);
}
});
//列表項選中事件
userList.setOnItemSelectedListener(new ListView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
System.out.println("selected———-" +arg2);
System.out.println("selected———-" +arg3);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
//列表項長按事件
userList.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
System.out.println("long———" + arg2);
System.out.println("long———" + arg3);
return true;
}
});
}
}
上邊註釋的三句話
第一句 是我們可以自定義佈局文件展示數據
第二句 我們可以用內置的佈局文件來展示
第三句 和第二句一樣,但是效果不一樣,大傢運行看看就明白瞭
GridView
類似與手機主菜單中展示的效果,如圖
網格視圖控件和我們的ListView 操作很像,上邊已經解釋過瞭,這裡直接貼代碼瞭
package TSD.Jason.Example;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;
import android.widget.SimpleAdapter;
public class GridViewActivity extends Activity {
// 定義整型數組 即圖片源
private Integer[] mImageIds =
{
R.drawable.img1,
R.drawable.img2,
R.drawable.img3,
R.drawable.img4,
R.drawable.img5,
R.drawable.img6,
R.drawable.img7,
R.drawable.img8,
R.drawable.img1,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.gridview);
GridView gridview = (GridView) findViewById(R.id.gridview);
// 生成動態數組,並且轉入數據
ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < 9; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("ItemImage", mImageIds[i]);// 添加圖像資源的ID
map.put("ItemText", "NO." + String.valueOf(i));// 按序號做ItemText
lstImageItem.add(map);
}
SimpleAdapter simple = new SimpleAdapter(this, lstImageItem,
R.layout.gridviewitem,
new String[] { "ItemImage", "ItemText" }, new int[] {
R.id.ItemImage, R.id.ItemText });
gridview.setAdapter(simple);
}
}