Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> 使用 Eclipse 和 Android 小部件進行 Android 開發的簡介(四)

使用 Eclipse 和 Android 小部件進行 Android 開發的簡介(四)

編輯:開發入門

使用 listVIEw 小部件:一個簡單的樣例應用程序

在本部分中,我們將創建一個樣例應用程序(見圖 9a,9b)來使用listVIEw 小部件顯示電話簿中的所有聯系人。本例的目的不止在於展示 listVIEw 小部件的使用,而且展示如何使用 ContentProvider 和 ContentResolver 類獲取電話數據。要留意 UI XML 文件,因為有兩個 UI 布局:一個用於指定 listVIEw 小部件顯示的列表如何適應主 UI,另一個用於指定列表的每個元素的外觀如何。另一個要點是,為使應用程序能夠讀取電話數據而進行的權限設置。該例是理解如何將意圖和意圖過濾器納入應用程序的第一步。盡管意圖不在本文討論范圍之內,讀者可能會注意到,要將這個示例應用程序轉化為實際電話簿應用程序,只需對列表項目實現點擊操作,並創建一個呼叫意圖和意圖過濾器來發起對選定聯系人的呼叫。

在本例中,聯系人將以垂直線性方式顯示,且選定的聯系人出現在列表頂部,使用大斜體字體和藍色背景。屏幕左下角還有一個復選框,選中該復選框時,將僅顯示帶星號的聯系人(或首選聯系人)。本例中應用程序的標題是 “Contact Manager”。這裡我們使用三類小部件:textVIEwlistVIEw 和 checkBox。我們使用 textVIEw 小部件來顯示當前選中的聯系人。您可以將 listVIEw 小部件看作是textVIEw 小部件的列表。一個 listVIEw 使用適配器設計模式來將數據(在本例中是聯系人)和數據視圖(在本例中是 textVIEw)連接到 listVIEw。在 listVIEw 上的任何點擊操作都可通過實現AdapterVIEw.OnItemClickListener() 被捕捉到。

在繼續之前,我們應當在 android 仿真器(AVD)的聯系人部分擁有一些存儲的聯系人。為此,點擊 AVD 主屏幕上的 Contacts,然後點擊 Menu 來獲取 Add Contacts 選項。Favorites 部分描述如何將聯系人標記為首選的或帶星號的。


圖 9a. 聯系人應用程序在一個 listVIEw 小部件中顯示所有聯系人
在 Android Virtual Device 中運行的聯系人應用程序的屏幕截圖,顯示聯系人列表,突出顯示創建者條目 


圖 9b. 聯系人應用程序在選中 show-starred contacts 復選框時在一個 listVIEw 小部件中顯示所有帶星號的聯系人
在 AVD 中運行的聯系人應用程序的屏幕截圖,其中 ‘show-starred contacts only’ 選項被選中,條目集經過精簡 

 

現在我們要定義一些字符串。


清單 5. strings.XML 文件中定義的字符串

					
<?XML version="1.0" encoding="utf-8"?>
<resources>
  <string name="hello">Hello World, Manager!</string> 
  <string name="app_name">Contact Manager</string> 
  <string name="selectedEntry" /> 
  <color name="White">#FFFFFF</color> 
  <color name="Black">#000000</color> 
  <color name="Blue">#0000FF</color> 
 <string name="showStarred">Show starred contacts only</string>
</resources>

 

main.XML

讓我們為我們的應用程序定義主布局。listVIEw 小部件將提供電話簿中所有聯系人的列表。listVIEw 顯示 textVIEw 小部件內的每個項目,這是我們接下來要定義的。


清單 6. main.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"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:id="@+id/selectedContact" 
    android:padding="10dp" 
    android:textSize="20sp" 
    android:textStyle="italic" 
    android:typeface="serif" 
    android:background="@color/Blue" 
    android:textColor="@color/White" 
    android:text="@string/selectedEntry"/>
<ListView 
    android:id="@+id/contactsListView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1">
    </ListVIEw>
<CheckBox android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/showStarred"
    android:text="@string/showStarred"/>
</LinearLayout>

 

注意,將 listVIEw 的 layout_weight 設置為 1 可確保列表能盡可能多地覆蓋屏幕,直到有新的小部件被定義。

contactItem.XML

除了主布局之外,這裡我們需要定義另一個布局。這是為了表示listVIEw 中的每個元素。在這裡我們使用一個簡單的 textVIEw


清單 7. textVIEw 小部件的代碼,構成 listVIEw 小部件的每個元素

					
<?xml version="1.0" encoding="utf-8"?>
<TextVIEw
  XMLns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:padding="5dp" 
  android:textStyle="bold" 
  android:id="@+id/contactItem">
</TextVIEw>

 

注意,android 默認提供一個可用的簡單布局,而不用定義您自己的布局。這可以通過 android.R.layout.simple_list_item_1 得到引用。

ManageContacts.Java

清單 8 展示如何實現主活動。我們使用 populateContactList() 方法來查詢聯系人數據庫並在 listVIEw 中顯示它們。


清單 8. 主活動的實現

					
public class ManageContacts extends Activity {
    private ListView mContactList;
    private CheckBox mCheckBox;
    private boolean mShowStarred;
    private TextView selectedText;
     /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mContactList = (ListView) findViewById(R.id.contactsListView);
        mCheckBox = (CheckBox) findViewById(R.id.showStarred);
        selectedText = (TextView) findViewById(R.id.selectedContact);
        mShowStarred = false;
        
        mCheckBox.setOnCheckedChangeListener(new CheckChangedListener());
        
        mContactList.setOnItemClickListener(new ClickListener());
        
        populateContactList();
       
    }
    
    public void populateContactList() {
         Uri uri = ContactsContract.Contacts.CONTENT_URI;
         String[] projection = new String[] {
                 ContactsContract.Contacts._ID,
                 ContactsContract.Contacts.DISPLAY_NAME,
         };
         String[] selectionArgs = null;
         String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + 
" COLLATE LOCALIZED ASC";
         String selection = mShowStarred? ContactsContract.Contacts.STARRED + 
" ='1'" : null;
         Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, 
sortOrder);
         
         String[] fields = new String[] {
                 ContactsContract.Data.DISPLAY_NAME
         };
         SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contactitem,
c, fields, new int[] {R.id.contactItem});
         mContactList.setAdapter(adapter);
         
    }
    
    private class ClickListener implements OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> arg0, View textView, int pos, long arg3) {
            if(textView instanceof TextView)
                selectedText.setText(((TextView) textView).getText());
         }
     }
    
    private class CheckChangedListener implements OnCheckedChangeListener {

        @Override
        public void onCheckedChanged(CompoundButton buttonVIEw, boolean isChecked) {
             mShowStarred = isChecked;
             selectedText.setText("");
             populateContactList();
            
        }
        
    }
}

 

需要注意的事項:

  • 我們有兩個偵聽器 — 一個用於處理對列表項目的點擊,另一個用於處理對復選框的點擊。前者僅將藍色 textVIEw 框中的文本設置為當前選中聯系人的顯示名稱。後者將設置 mShowStarred 字段並重新填充列表。
  • 要讀取電話數據庫中的聯系人,我們需要通過查詢它獲取一個游標。查詢具有以下參數:
    1. uri — 為要檢索的內容使用 content:// 模式的 URI。
    2. projection — 要返回的列的列表。傳遞空值將返回所有列,不建議這樣做,以防止從不打算使用的存儲中讀取數據。
    3. selection — 一個聲明要返回哪些行的過濾器,被格式化為一個 SQL WHERE 子句(排除 WHERE 本身)。傳遞空值將為給定 URI 返回所有行。
    4. selectionArgs — 您可能還包含 ?s,這將由來自 selectionArgs的值以它們出現在選取范圍中的順序所取代。該值將被綁定為 Strings。
    5. sortOrder — 如何對行進行排序,被格式化為一個 SQL ORDER BY子句(排除 ORDER BY 本身)。傳遞空值將使用默認的排序順序,這個順序可能是無序的。

獲得的結果集游標必須通過一個適配器鏈接到 UI。在這裡我們使用一個 SimpleCursorAdapter,不過 android 還提供一個ListAdapter。獲取適配器之後,我們需要將其附加到 listVIEw,現在完成了。


權限

應用程序在 android 設備上成功運行之前的最後一步是設置權限。沒有能夠讀取聯系人數據庫的權限,設備中的 Linux 內核不會允許應用程序這麼做。因此讓我們轉至androidManifest.XML>Permissions 選項卡,並設置以下權限:

  1. android.permission.GET_ACCOUNTS
  2. android.permission.READ_CONTACTS

可以通過點擊 U 圖標並定義權限來進行這些設置。圖 10 展示權限選項卡的外觀。


圖 10. android 權限清單
顯示權限選項卡的屏幕截圖,包含 android.permission.GET_ACCOUNTS(Uses Permission) 和 android.permission.READ_CONTACTS (Uses Permission) 的條目 

 

使用 ListActivity 的 listVIEw 小部件

本例意在展示實現 listVIEw 的另一種方式。在上述應用程序中,注意到我們的主活動實現了活動類。在處理 listVIEw 小部件時,有時ListActivity 類來得更方便些,因為它有一個公共 APIs 可處理對列表項目的點擊、列表適配器的設置、點擊位置的獲取,等等。

我們可以修改我們的活動來實現 ListActivity,如清單 9 所示。


清單 9. 使用 ListActivity 的實現

					
public class ManageContacts extends ListActivity {
    @Override
    protected void onListItemClick(ListView l, View v, 
int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
if(v instanceof TextView)
selectedText.setText(((TextView) v).getText());
}
private CheckBox mCheckBox;
private boolean mShowStarred;
private TextView selectedText;
/** Called when the activity is first created. */
@Override
public void 
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mCheckBox = (CheckBox) findViewById(R.id.showStarred);
selectedText = (TextView) 
findViewById(R.id.selectedContact);
mShowStarred = false;

mCheckBox.setOnCheckedChangeListener(new 
CheckChangedListener());

populateContactList();

}

public void populateContactList() {
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
};
String[] selectionArgs = null;
String sortOrder = 
ContactsContract.Contacts.DISPLAY_NAME +      
" COLLATE LOCALIZED ASC";
String selection = mShowStarred?
ContactsContract.Contacts.STARRED + " ='1'" : null;
Cursor c = 
getContentResolver().query(uri, projection, 
selection, selectionArgs, sortOrder);

String[] fields = new String[] {
ContactsContract.Data.DISPLAY_NAME
};
ListAdapter adapter = new 
SimpleCursorAdapter(this, 
R.layout.contactitem, c, fields, new 
int[]{R.id.contactItem});
setListAdapter(adapter);

}

private class CheckChangedListener 
implements OnCheckedChangeListener {

@Override
public void onCheckedChanged(CompoundButton 
buttonVIEw, boolean isChecked) {
mShowStarred = isChecked;
selectedText.setText("");
populateContactList();
   }
        
    }
}

 

注意,這裡我們僅實現了 ListActivity 的 onListItemClick 方法,而非聲明一個匿名類來處理點擊。在這裡我們也不需要引用在 main.XML 中定義的 listVIEw 小部件,因為 ListActivity 假定已經定義了 ID 為 @android:id/list 的 listVIEw 小部件。這一點需要注意。每當我們使用 ListActivity 時,我們都必須在 main.XML 中定義 listVIEw 小部件,使其 ID 為 @android:id/list;否則,ListActivity 不會知道要引用哪個 listVIEw

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved