Android開發教程—控件之Dialog ListView GridView – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

 

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);

    }

}

  

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *