第十三章:經常使用控件下

一、ListViewhtml

在android開發中ListView是比較經常使用的組件,它以列表的形式展現具體內容,而且可以根據數據的長度自適應顯示。抽空把對ListView的使用作了整理,並寫了個小例子:前端

 列表的顯示須要三個元素:java

1.ListVeiw 用來展現列表的View。android

2.適配器 用來把數據映射到ListView上的中介。數據庫

3.數據    具體的將被映射的字符串,圖片,或者基本組件。windows

根據列表的適配器類型,列表分爲三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter後端

其中以ArrayAdapter最爲簡單,只能展現一行字。SimpleAdapter有最好的擴充性,能夠自定義出各類效果。SimpleCursorAdapter能夠認爲是SimpleAdapter對數據庫的簡單結合,能夠方面的把數據庫的內容以列表的形式展現出來。數組

 咱們從最簡單的ListView開始:瀏覽器

package com.example.helloandroid;

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

import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class AndroidControl2Activity extends Activity  {
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_control2);
        
        listView = new ListView(this);
        
        listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
        
        setContentView(listView);
    }
    private List<String> getData(){

        List<String> data = new ArrayList<String>();
        data.add("測試數據1");
        data.add("測試數據2");
        data.add("測試數據3");
        data.add("測試數據4");
        return data;

    }
}
View Code

上面代碼使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)來裝配數據,要裝配這些數據就須要一個鏈接ListView視圖對象和數組數據的適配器來二者的適配工做,ArrayAdapter的構造須要三個參數,依次爲this,佈局文件(注意這裏的佈局文件描述的是列表的每一行的佈局,android.R.layout.simple_list_item_1是系統定義好的佈局文件只顯示一行文字,數據源(一個List集合)。同時用setAdapter()完成適配的最後工做。運行後的顯示效果以下圖:app

SimpleAdapter

simpleAdapter的擴展性最好,能夠定義各類各樣的佈局出來,能夠放上ImageView(圖片),還能夠放上Button(按鈕),CheckBox(複選框)等等。下面的代碼都直接繼承了ListActivity,ListActivity和普通的Activity沒有太大的差異,不一樣就是對顯示ListView作了許多優化,方面顯示而已。

下面的程序是實現一個帶有圖片的類表。

首先須要定義好一個用來顯示每個列內容的xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal" android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <LinearLayout android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFFFFFFF"
            android:textSize="22px" />

        <TextView android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFFFFFFF"
            android:textSize="13px" />
    </LinearLayout>

</LinearLayout>
View Code

實現代碼:

package com.example.helloandroid;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class AndroidControl2Activity extends ListActivity   {
    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.activity_android_control2,
                new String[]{"title","info"},
                new int[]{R.id.title,R.id.info});

        setListAdapter(adapter);

    }

    private List<Map<String, Object>> getData() {

        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = new HashMap<String, Object>();
        
        map.put("title", "G1");
        map.put("info", "google 1");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "G2");
        map.put("info", "google 2");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "G3");
        map.put("info", "google 3");
        list.add(map);

        return list;

    }

}
View Code

使用simpleAdapter的數據用通常都是HashMap構成的List,list的每一節對應ListView的每一行。HashMap的每一個鍵值數據映射到佈局文件中對應id的組件上。由於系統沒有對應的佈局文件可用,咱們能夠本身定義一個佈局vlist.xml。下面作適配,new一個SimpleAdapter參數一次是:this,佈局文件(xml),HashMap的 title 和 info。佈局文件的組件id,title,info。佈局文件的各組件分別映射到HashMap的各元素上,完成適配。

 二、Spinner

一般分5步:

第一步:添加一個下拉列表項的list,這裏添加的項就是下拉列表的菜單項 
第二步:爲下拉列表定義一個適配器,這裏就用到裏前面定義的list。
第三步:爲適配器設置下拉列表下拉時的菜單樣式。
第四步:將適配器添加到下拉列表上
第五步:爲下拉列表設置各類事件的響應,這個事響應菜單被選中

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  
    android:id= "@+id/widget28"  
    android:layout_width= "fill_parent"  
    android:layout_height= "fill_parent"  
    android:orientation= "vertical"  
    xmlns:android= "http://schemas.android.com/apk/res/android" >  
    <TextView  
        android:id= "@+id/TextView_Show"  
        android:layout_width= "fill_parent"  
        android:layout_height= "wrap_content"  
        android:text= "你選擇的是"  
        android:textSize= "25sp" >  
    </TextView>  
    <Spinner  
        android:id= "@+id/spinner_City"  
        android:layout_width= "fill_parent"  
        android:layout_height= "wrap_content" >  
    </Spinner> 
</LinearLayout> 
View Code

代碼:

package com.example.helloandroid;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class AndroidControl3Activity extends Activity {
       private List<String> list = new ArrayList<String>(); 
        private Spinner mySpinner; 
        private TextView myTextView; 
        private ArrayAdapter<String> spinneradapter; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_control3);
        
         //Spinner顯示
          //第一步:添加一個下拉列表項的list,這裏添加的項就是下拉列表的菜單項 
            list.add("北京");
            list.add("上海");
            list.add("深圳");
            list.add("廣州");
            mySpinner = (Spinner)findViewById(R.id.spinner_City); 
            myTextView = (TextView)findViewById(R.id.TextView_Show); 
          //第二步:爲下拉列表定義一個適配器,這裏就用到裏前面定義的list。 
            spinneradapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list); 
          //第三步:爲適配器設置下拉列表下拉時的菜單樣式。 
            spinneradapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
          //第四步:將適配器添加到下拉列表上 
            mySpinner.setAdapter(spinneradapter); 
            //第五步:爲下拉列表設置各類事件的響應,這個事響應菜單被選中 
            mySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){

                @Override
                public void onItemSelected(AdapterView<?> parent, View view,
                        int position, long id) {
                    // TODO Auto-generated method stub
                    myTextView.setText("您選擇的是:"+ spinneradapter.getItem(position)); 
                    /* 將mySpinner 顯示*/ 
                    view.setVisibility(View.VISIBLE); 
                    
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // TODO Auto-generated method stub
                    
                }

            });

    }
}
View Code

  三、GridView

GirdView的一些屬性:

android:numColumns="auto_fit" --------列數設置爲自動 android:columnWidth="90dp",----------每列的寬度,也就是Item的寬度 android:stretchMode="columnWidth"------縮放與列寬大小同步 android:verticalSpacing="10dp"----------垂直邊距 android:horizontalSpacing="10dp"-------水平邊距

一、準備數據源

二、新建適配器

三、加載適配器

GridView(網格視圖)是按照行列的方式來顯示內容的,通常用於顯示圖片,圖片等內容,好比實現九宮格圖,用GridView是首選,也是最簡單的,下面來個實例,

activity_android_control4.xml:

<?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:background="#000"
    >
    
<GridView 
        android:id="@+id/gview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="auto_fit"    
        android:columnWidth="80dp"
        android:stretchMode="columnWidth"
        ></GridView>
</LinearLayout>
View Code

item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:gravity="center"
    android:padding="10dp"
    >
    
    
<ImageView 
    android:src="@drawable/ic_launcher"
    android:id="@+id/image"
    android:layout_width="60dp"
    android:layout_height="60dp"
    
    />

<TextView 
    android:id="@+id/text"
    android:layout_marginTop="5dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#ffffff"
    android:text="文字"
    />
</LinearLayout>
View Code

AndroidControl4Activity.java:

package com.example.helloandroid;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.GridView;
import android.widget.SimpleAdapter;

public class AndroidControl4Activity extends Activity {
    private GridView gview;
    private List<Map<String, Object>> data_list;
    private SimpleAdapter sim_adapter;
    // 圖片封裝爲一個數組
    private int[] icon = { R.drawable.address_book, R.drawable.calendar,
            R.drawable.camera, R.drawable.clock, R.drawable.games_control,
            R.drawable.messenger, R.drawable.ringtone, R.drawable.settings,
            R.drawable.speech_balloon, R.drawable.weather, R.drawable.world,
            R.drawable.youtube };
    private String[] iconName = { "通信錄", "日曆", "照相機", "時鐘", "遊戲", "短信", "鈴聲",
            "設置", "語音", "天氣", "瀏覽器", "視頻" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_control4);
        
        gview = (GridView) findViewById(R.id.gview);
        //新建List
        data_list = new ArrayList<Map<String, Object>>();
        //獲取數據
        getData();
        //新建適配器
        String [] from ={"image","text"};
        int [] to = {R.id.image,R.id.text};
        sim_adapter = new SimpleAdapter(this, data_list, R.layout.item, from, to);
        //配置適配器
        gview.setAdapter(sim_adapter);

    }
    public List<Map<String, Object>> getData(){        
        //cion和iconName的長度是相同的,這裏任選其一均可以
        for(int i=0;i<icon.length;i++){
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("image", icon[i]);
            map.put("text", iconName[i]);
            data_list.add(map);
        }
            
        return data_list;
    }

}
View Code

 

  四、Dialog

 

在Android開發中,咱們常常會須要在界面上彈出一些對話框,好比詢問用戶或者讓用戶選擇。這些功能咱們叫它Android Dialog對話框,在咱們使用Android的過程當中,據我所知,Android Dialog的類型無非也就7種,下面我分別向你們介紹這7Android Dialog對話框的使用方法,但願對你們能有所幫助。

 

圖1

圖2

圖3

圖4

圖5

圖6

圖7

圖8

1、主窗體圖1的實現,在Lanyout中添加7個按鈕,代碼以下所示:

main.xml
 1 package zqvie.com;  2 import android.app.Activity;  3 import android.app.AlertDialog;  4 import android.app.AlertDialog.Builder;  5 import android.os.Bundle;  6 import android.view.View;  7 import android.view.View.OnClickListener;  8 import android.widget.Button;  9 10 public class DialogActivity extends Activity implements OnClickListener { 11 /** Called when the activity is first created. */ 12  @Override 13 public void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15  setContentView(R.layout.main); 16 But_One=(Button) findViewById(R.id.But_One); //註冊按鈕But_One 17 But_Two=(Button) findViewById(R.id.But_Two); 18 But_Three=(Button) findViewById(R.id.But_Three); 19 But_Four=(Button) findViewById(R.id.But_Four); 20 But_Five=(Button) findViewById(R.id.But_Five); 21 But_Six=(Button) findViewById(R.id.But_Six); 22 But_Seven=(Button) findViewById(R.id.But_Seven); 23 But_One.setOnClickListener(this); //爲按鈕But_One註冊偵聽器 24  } 25 Button But_One,But_Two,But_Three,But_Four,But_Five,But_Six,But_Seven; //定義按鈕 26 }
DialogActivity.java

2、圖2的實現,設置單擊「按鈕1」時,彈出對話框,代碼以下所示:

複製代碼
 public void onClick(View v) { // TODO Auto-generated method stub if(v.getId()==R.id.But_One) { AlertDialog.Builder builder=new AlertDialog.Builder(DialogActivity .this);//生成一個對話框對象 builder.setMessage("肯定要退出嗎?"); //設置對話框的顯示信息 builder.setTitle("提示"); //設置對話框的標題 builder.setPositiveButton("肯定",null); //設置第一個按鈕的Text,null處也可替換爲new OnClickListener() {} builder.setNegativeButton("取消",null); //設置第二個按鈕的Text builder.create().show(); //建立並顯示對話框  } }
複製代碼

 3、圖3的實現,設置單擊「按鈕2」時,彈出對話框,代碼和效果圖2以下所示:

複製代碼
if(v.getId()==R.id.But_Two) { AlertDialog.Builder builder= new AlertDialog.Builder(DialogActivity.this);//生成一個對話框對象 builder.setIcon( android.R.drawable.btn_star);//設置對話框的圖標 builder.setTitle("喜愛調查"); //設置對話的標題 builder.setMessage("你喜歡李連杰的電影嗎"); //設置對話框的顯示信息 builder.setPositiveButton("很喜歡",null); builder.setNeutralButton("通常",null); builder.setNegativeButton("不喜歡",null); builder.create().show(); } 
複製代碼

 4、圖4的實現,設置單擊「按鈕3」時,彈出對話框,代碼和效果圖3以下所示:

複製代碼
 1 if(v.getId()==R.id.But_Three)  2  {  3 AlertDialog.Builder builder=new AlertDialog.Builder(this);  4 builder.setTitle("請輸入");  5 builder.setIcon(android.R.drawable.ic_dialog_info); //設置對話框的圖標  6 builder.setView(new EditText(this)); //設置對話框中顯示一個輸入框  7 builder.setPositiveButton("肯定",null);  8 builder.setNegativeButton("取消",null);  9  builder.show(); 10 }
複製代碼

 5、圖5的實現,設置單擊「按鈕4」時,彈出對話框,代碼和效果圖4以下所示:

複製代碼
1 if(v.getId()==R.id.But_Four) 2  { 3 Builder builder=new AlertDialog.Builder(this); //生成一個對話框對象 4 builder.setTitle("單選框"); //設置對話框的標題 5 builder.setIcon(android.R.drawable.ic_dialog_info); //設置對話框的圖標 6 builder.setSingleChoiceItems( new String[] { "Item1", "Item2" }, 0,null); //設置對話框的單選項 7 builder.setNegativeButton("取消", null); 8  builder.create().show(); 9 }
複製代碼

 6、圖6的實現,設置單擊「按鈕5」時,彈出對話框,代碼和效果圖5以下所示:

複製代碼
1 if(v.getId()==R.id.But_Five) 2  { 3 Builder builder=new AlertDialog.Builder(this); //生成一個對話框對象 4 builder.setTitle("複選框"); //設置對話框的標題 5 builder.setMultiChoiceItems( new String[] { "Item1", "Item2" }, null, null); //設置對話框的複選項 6 builder.setPositiveButton("肯定", null); //設置對話框的第一個按鈕"肯定" 7 builder.setNegativeButton("取消", null); //設置對話框的第二個按鈕"取消" 8  builder.show(); 9 }
複製代碼

 7、圖7的實現,設置單擊「按鈕6」時,彈出對話框,代碼和效果圖6以下所示:

複製代碼
1 if(v.getId()==R.id.But_Six) 2  { 3 Builder builder=new AlertDialog.Builder(this); //生成一個對話框對象 4 builder.setTitle("列表框"); 5 builder.setItems(new String[]{"Item1","Item2"},null); 6 builder.setNegativeButton("肯定",null); 7  builder.create().show(); 8 }
複製代碼

 8、圖8的實現,設置單擊「按鈕7」時,彈出自定義對話框,這種對話框相對上面講的要複雜一些,它須要經過一個.xml文件來傳遞你要呈現的佈局。代碼和效果圖7以下所示:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3 android:layout_height="wrap_content" android:layout_width="wrap_content"  4 android:background="#ffffffff" android:orientation="horizontal"  5 android:id="@+id/mydialog">  6 <TextView android:layout_height="wrap_content"  7 android:layout_width="wrap_content"  8 android:id="@+id/tvname" android:text="姓名:" />  9 <EditText android:layout_height="wrap_content" 10 android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/> 11 12 </LinearLayout>
dialog.xml
 1 if(v.getId()==R.id.But_Seven)  2  {  3 LayoutInflater inflater = getLayoutInflater();  4 View layout = inflater.inflate(R.layout.mydialog,  5 null);  6  7 new AlertDialog.Builder(this).setTitle("自定義佈局").setView(layout)  8 .setPositiveButton("肯定", null)  9 .setNegativeButton("取消", null).show(); 10 }
DialogActivity.java

感悟

     學習了製做對話框,才發現其實對話框的製做也是很是簡單的,通常狀況下只需設置對話框的標題、信息、圖標、按鈕便可,有的時候還須要添加文本框、單選按鈕、複選框、列表項。然而比較複雜的狀況就是自定義對話框。在設置自定義對話框的時候,須要設計一個你的xml文件,裏面是你的自定義佈局,而後經過,主窗體調用xml來實現自定義對話框的製做。

 

  五、ProgressDialog

先看效果:

佈局文件:

<?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">  
    
    <Button android:text="圓形進度條" android:id="@+id/Button01"  
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
    <Button android:text="長型進度條" android:id="@+id/Button02"  
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
  
</LinearLayout>  
View Code

代碼:

package com.example.helloandroid;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ProgressDialogActivity extends Activity {

    private ProgressDialog mpDialog;  
    private Button btn1,btn2;  
    private int mCount = 0;  

    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_dialog);
        
         //獲得按鈕對象 
        btn1 = (Button)findViewById(R.id.Button01); 
        btn2 = (Button)findViewById(R.id.Button02); 
        btn1.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mpDialog = new ProgressDialog(ProgressDialogActivity.this);  
                mpDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//設置風格爲圓形進度條  
                mpDialog.setTitle("提示");//設置標題  
                mpDialog.setIcon(R.drawable.clock);//設置圖標  
                mpDialog.setMessage("這是一個圓形進度條");  
                mpDialog.setIndeterminate(false);//設置進度條是否爲不明確  
                mpDialog.setCancelable(true);//設置進度條是否能夠按退回鍵取消  
                mpDialog.setButton("肯定", new DialogInterface.OnClickListener(){  
                        @Override  
                         public void onClick(DialogInterface dialog, int which) {  
                                dialog.cancel();  
                                          
                                }  
                                      
                          });  
                mpDialog.show();  
            }
            
        });


        //設置mButton02的事件監聽 

        btn2.setOnClickListener(new Button.OnClickListener() { 
                     @Override 
                     public void onClick(View v) 
                     { 
                         // TODO Auto-generated method stub 
                         mCount = 0; 
                         // 建立ProgressDialog對象 
                         mpDialog = new ProgressDialog(ProgressDialogActivity.this); 
                         // 設置進度條風格,風格爲長形 
                         mpDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
                         // 設置ProgressDialog 標題 
                         mpDialog.setTitle("提示"); 
                         // 設置ProgressDialog 提示信息 
                         mpDialog.setMessage("這是一個長形對話框進度條"); 
                         // 設置ProgressDialog 標題圖標 
                         mpDialog.setIcon(R.drawable.camera); 
                         // 設置ProgressDialog 進度條進度 
                         mpDialog.setProgress(100); 

                         // 設置ProgressDialog 的進度條是否不明確 

                         mpDialog.setIndeterminate(false); 

                         // 設置ProgressDialog 是否能夠按退回按鍵取消 

                         mpDialog.setCancelable(true); 

                         // 讓ProgressDialog顯示 

                         mpDialog.show(); 

                         new Thread() 

                         { 
                             public void run() 
                             { 
                                 try 
                                 { 
                                     while (mCount <= 100) 
                                     { 
                                         // 由線程來控制進度。 
                                         mpDialog.setProgress(mCount++); 
                                         Thread.sleep(100); 
                                     } 
                                     mpDialog.cancel(); 
                                 } 
                                 catch (InterruptedException e) 
                                 { 
                                     mpDialog.cancel(); 
                                 } 

                             } 

                         }.start(); 

                     } 

                 }); 

        
    }
}
View Code

六、Menu

 Android的菜單有三種:
Options Menu
  當用戶按下menu button按鈕時顯示的菜單
Context Menu
  當用戶長久按住屏幕,即被註冊顯示上下文菜單的視圖時顯示的菜單
Submenu
  當用戶按下一個菜單的某個選項時彈出的子菜單

Options Menu建立選項菜單的步驟:

一、覆蓋Activity 的onCreateOptionMenu(Menu menu)方法,當菜單第一次被打開時調用

二、調用Menu 的add( )方法添加菜單項(MenuItem),同時能夠調用MenuItem 的setIcon( )方法來爲菜單項設置圖標

三、當菜單項(MenuItem)被選擇時,覆蓋Activity 的onOptionsItemSelected(MenuItem item)來響應事件

 

 

Context Menu顧名思義,與上下文(環境)有關。思想相似於Windows中的右鍵單擊彈出的快捷菜單。操做時須要長時間按住某個東東不放。

建立上下文菜單的步驟:

一、覆蓋Activity 的onCreateContextMenu(Menu menu)方法,調用Menu的add()方法添加菜單項(MenuItem)。

二、覆蓋Activity 的onContextItemSelected(MenuItem iitem)來響應事件。

三、調用registerForContextMenu( )方法來爲視圖註冊上下文菜單。

佈局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

<Button
        android:id="@+id/ContextButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="20"
        android:text="按我彈出Context Menu" />

</RelativeLayout>
View Code

代碼:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MenuActivity extends Activity {

    private Button btnContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        
        btnContext = (Button) findViewById(R.id.ContextButton);
        registerForContextMenu(btnContext);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        //當用戶按下menu button按鈕時顯示的菜單 
        menu.add(0, 1, 1, "香蕉");
        menu.add(0, 2, 2, "蘋果");
        //當用戶按下一個菜單的某個選項時彈出的子菜單
        SubMenu subMenu = menu.addSubMenu(1, 100, 100, "桃子");
        subMenu.add(2, 101, 101, "大桃子");
        subMenu.add(2, 102, 102, "小桃子");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        if(item.getItemId() == 1){
            Toast t = Toast.makeText(this, "你選的是蘋果", Toast.LENGTH_LONG);
            t.show();
        }
        else if(item.getItemId() == 2){
            Toast t = Toast.makeText(this, "你選的是香蕉", Toast.LENGTH_SHORT);
            t.show();
        } 
        return true;

    }
    //Context Menu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        if(v==btnContext){
            menu.setHeaderTitle("這是1");
            menu.add(200, 200, 200, "Context Menu 1");
            menu.add(200, 201, 201, "Context Menu 2");
        }
        super.onCreateContextMenu(menu, v, menuInfo);
    }
    
    
}
View Code


效果圖:

 

七、AutoCompleteTextView

 自動完成文本框,它實際上也是一個文本編輯框,能夠理解爲對EditText功能的擴展,它對輸入的內容能夠進行提示而且自動完成。本文會講解經常使用屬性設置,以及如何向AutoCompleteTextView增長提示數據.

說明

  自動完成文本框(AutoCompleteTextView),能夠從官方文檔上看出,是從EditText繼承而來,因此它實際上也是一個文本編輯框,只是多了一個自動提示輸入補全的功能。功能相似於:當用戶輸入必定字符以後,自動完成文本框會顯示一個下拉列表,供用戶從中選擇,當用戶選擇某個菜單項以後,AutoCompleteTextView會按照的選擇自動填寫該文本框。

 

經常使用屬性

  由於是繼承自EditText,因此AutoCompleteTextView除了可使提供用Edit的屬性和方法以外,還支持以下一些特殊的屬性及方法,這裏只介紹一些經常使用的,具體請參見官方文檔:

  • android:completionHint/setCompletionHint(CharSequence):設置出現下拉列表的提示標題。
  • android:completionTjreshold/setThreshold(int):設置至少輸入幾個字符纔會顯示提示。
  • android:dropDownHeight/setDropHeight(int):設置下拉列表的高度。
  • android:dropDownWidth/setDropWidth(int):設置下拉列表的寬度。
  • android:popupBackground/setDropDownbackgroundResource(int):設置下拉列表的背景。

 

填充選擇數據

  在Android程序中,爲了展現數據,一般會用到一個Adapter的接口。沒錯,這是一個接口,是鏈接後端數據和前端顯示的橋樑,是data souce和UI(View)之間一個重要的紐帶。下圖展現了Adapter在Android程序中的關係:

對於Adapter,它是一個接口,Android爲其聲明瞭各類實現類,對於在AutoCompleteTextView控件中,通常使用ArrayAdapter<T>便可完成功能,對於一些其餘實現類的應用場景,之後會慢慢介紹。

  ArrayAdapter<T>繼承自一個抽象類BaseAdapter,而這個抽象類實現了Adapter接口,因此繼承關係應該是:Adapter→BaseAdater→ArrayAdapter<T>。

  從名字上能夠看出,ArrayAdapter<T>是以一個數組的形式去存儲數據的,它也確實是這麼作的,而且能夠傳遞一個數組對其進行構造。因此咱們只須要填充一個數組對象,就完成ArrayAdapter對象的初始化工做,在把獲得的ArrayAdapter對象傳遞給AutoCompleteTextView控件,便可對其進行選擇數據設置。

佈局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <AutoCompleteTextView
         android:id="@+id/autotext"
         android:completionHint="Famous Citi"
         android:completionThreshold="1"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />


</RelativeLayout>
View Code

代碼:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class AutoCompleteTextViewActivity extends Activity {
    private AutoCompleteTextView autotext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auto_complete_text_view);
        
        autotext=(AutoCompleteTextView)findViewById(R.id.autotext);
        //設置數據源
        String[] autoStrings=new String[]{"New York","Tokyo","beijing","london","Seoul Special","Los Angeles"};
        //設置ArrayAdapter,而且設定以單行下拉列表風格展現(第二個參數設定)。
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(AutoCompleteTextViewActivity.this, 
         android.R.layout.simple_dropdown_item_1line, autoStrings);
        
        autotext.setAdapter(adapter);



    }
}
View Code

 

八、SeekBar

拖動條(SeekBar)和進度條很是類似,只是進度條採用顏色填充來代表進度完成的程度,而拖動條則經過滑塊的位置來標識數值----並且拖動條容許用戶拖動滑動塊來改變值,所以拖動條一般用於對系統的某種數值進行調節,好比音量調節。

SeekBar容許用戶改變拖動條的滑塊外觀,改變滑塊外觀經過以下屬性來指定

android:thumb  指定一個Drawable對象,該對象將做爲自定義滑塊。

爲了讓程序能響應拖動條滑塊位置的改變,程序能夠考慮爲他綁定一個OnSeekBarChangerListener監聽器。

經過一個實例:經過滑動塊來改變圖片的透明度,來看看SeekBar。

佈局XML:

<?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"
    >
<ImageView 
    android:id="@+id/image"
    android:layout_width="fill_parent" 
    android:layout_height="240px" 
    android:src="@drawable/world"
    />
<SeekBar 
    android:id="@+id/seekbar"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:max="255"
    android:progress="255"
    android:thumb="@drawable/ic_launcher"
    />
</LinearLayout>
View Code

代碼:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class SeekBarActivity extends Activity {
    private ImageView  image;
    private SeekBar seekBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seek_bar);
        
        image = (ImageView)this.findViewById(R.id.image);
        seekBar = (SeekBar)this.findViewById(R.id.seekbar);
        
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
            
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            
            //當拖動條的滑塊位置發生改變時觸發該方法
            @Override
            public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
                image.setAlpha(arg1);
            }
        });
    }
}
View Code

效果以下:

相關文章
相關標籤/搜索