編輯:開發入門
使用 listVIEw 小部件:一個簡單的樣例應用程序
在本部分中,我們將創建一個樣例應用程序(見圖 9a,9b)來使用listVIEw 小部件顯示電話簿中的所有聯系人。本例的目的不止在於展示 listVIEw 小部件的使用,而且展示如何使用 ContentProvider 和 ContentResolver 類獲取電話數據。要留意 UI XML 文件,因為有兩個 UI 布局:一個用於指定 listVIEw 小部件顯示的列表如何適應主 UI,另一個用於指定列表的每個元素的外觀如何。另一個要點是,為使應用程序能夠讀取電話數據而進行的權限設置。該例是理解如何將意圖和意圖過濾器納入應用程序的第一步。盡管意圖不在本文討論范圍之內,讀者可能會注意到,要將這個示例應用程序轉化為實際電話簿應用程序,只需對列表項目實現點擊操作,並創建一個呼叫意圖和意圖過濾器來發起對選定聯系人的呼叫。
在本例中,聯系人將以垂直線性方式顯示,且選定的聯系人出現在列表頂部,使用大斜體字體和藍色背景。屏幕左下角還有一個復選框,選中該復選框時,將僅顯示帶星號的聯系人(或首選聯系人)。本例中應用程序的標題是 “Contact Manager”。這裡我們使用三類小部件:textVIEw、listVIEw 和 checkBox。我們使用 textVIEw 小部件來顯示當前選中的聯系人。您可以將 listVIEw 小部件看作是textVIEw 小部件的列表。一個 listVIEw 使用適配器設計模式來將數據(在本例中是聯系人)和數據視圖(在本例中是 textVIEw)連接到 listVIEw。在 listVIEw 上的任何點擊操作都可通過實現AdapterVIEw.OnItemClickListener() 被捕捉到。
在繼續之前,我們應當在 android 仿真器(AVD)的聯系人部分擁有一些存儲的聯系人。為此,點擊 AVD 主屏幕上的 Contacts,然後點擊 Menu 來獲取 Add Contacts 選項。Favorites 部分描述如何將聯系人標記為首選的或帶星號的。
圖 9a. 聯系人應用程序在一個 listVIEw 小部件中顯示所有聯系人
圖 9b. 聯系人應用程序在選中 show-starred contacts 復選框時在一個 listVIEw 小部件中顯示所有帶星號的聯系人
現在我們要定義一些字符串。
清單 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 字段並重新填充列表。
WHERE 子句(排除 WHERE 本身)。傳遞空值將為給定 URI 返回所有行。
?s,這將由來自 selectionArgs的值以它們出現在選取范圍中的順序所取代。該值將被綁定為 Strings。
ORDER BY子句(排除 ORDER BY 本身)。傳遞空值將使用默認的排序順序,這個順序可能是無序的。獲得的結果集游標必須通過一個適配器鏈接到 UI。在這裡我們使用一個 SimpleCursorAdapter,不過 android 還提供一個ListAdapter。獲取適配器之後,我們需要將其附加到 listVIEw,現在完成了。
回頁首
權限
應用程序在 android 設備上成功運行之前的最後一步是設置權限。沒有能夠讀取聯系人數據庫的權限,設備中的 Linux 內核不會允許應用程序這麼做。因此讓我們轉至androidManifest.XML>Permissions 選項卡,並設置以下權限:
android.permission.GET_ACCOUNTS
android.permission.READ_CONTACTS可以通過點擊 U 圖標並定義權限來進行這些設置。圖 10 展示權限選項卡的外觀。
圖 10. android 權限清單
使用 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。
在 Android 應用程序中使用 Internet 數據(一)
Android 應用程序必須訪問位於 Internet 上的數據,而 Internet 數據可以有幾種不同的格式。本文將介紹在 android 應用程序中如何使用三種數
Android 開發簡介之三:編寫一個基本的應用程序
編寫一個基本的應用程序本節展示如何構建一個 Android 應用程序。示例應用程序非常簡單:一個修改後的 “Hello android” 應用程序。您將進行一個微小的修
Android學習之Android的智能指針
在android的源代碼中,經常會看到形如:sp<xxx>、wp<xxx>這樣的類型定義,這其實是android中的智能指針。智能指針是C++中
用 Eclipse 開發 Android 應用程序(四)
創建內容提供器和 Google Maps 應用程序您已經看到了一個完整的應用程序示例,現在簡要討論一下更加復雜的應用程序。內容提供器和 Google Maps本教程中討