編輯:開發入門
使用 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 上的數據,而 Internet 數據可以有幾種不同的格式。本文將介紹在 android 應用程序中如何使用三種數
編寫一個基本的應用程序本節展示如何構建一個 Android 應用程序。示例應用程序非常簡單:一個修改後的 “Hello android” 應用程序。您將進行一個微小的修
在android的源代碼中,經常會看到形如:sp<xxx>、wp<xxx>這樣的類型定義,這其實是android中的智能指針。智能指針是C++中
創建內容提供器和 Google Maps 應用程序您已經看到了一個完整的應用程序示例,現在簡要討論一下更加復雜的應用程序。內容提供器和 Google Maps本教程中討