Android學習筆記(三八):資源resource(上)、XML解析(XmlPullParser)

來源:互聯網
上載者:User

resource是java原始碼之外的靜態資訊。例如layout。resource作為檔案存放在res/目錄下面,除了res/raw/外,Android會自動解析,例如layout檔案,我們不需要自己去解析XML封裝。我們之前用過res/layout/,以及res/anim/之前已經用過。

Image:檔案存放在res/drawable/,存放應用的icon。

Raw:res/raw/,程式所需的任意格式的檔案,但是系統不會對其進行解析,也既Adroid Framework並不需要的。

String,color,array,dimension:在res/values中,將這些常量和我們的java原始碼分離,這樣便於程式的國際化或者本地化中。

XML,位於res/xml/,這些靜態XML檔案用於儲存程式的資料和結構。

String

定義resource

在resource中定義,有利於國際化或者本地化,即便不需要翻譯為其他語言,可以很方便去檢測或者修改,而無須在程式的各處去尋找,因此這是一種通用的處理方式。Android還支援常用的擴充方式,通過style,可以設定不同的格式。String在res/values/strings.xml中定義,根節點是resources,例如如下:

<resources><string name="quick">The quick brown fox...</string><string name="laughs">He who laughs last...</string<string name="c20_my_name">My name is %1$s %2$s</string><string name="c20_rich_text">My name is &lt;b&gt;%1$s&lt;/b&gt; &lt;i&gt;%2$s&lt;/i&gt;</string></resources>

  如果字串中包含"和',就需要用\"或者\',如果字串中只有一個單引號,可以使用"xxxxx 's xxxxxx"的方式,用雙引號括起來。

在layout檔案中,用@string/element_name,例如@string/quick來引用內容,在java原始碼中,用R.string.element_name作為ID,並用getString()來擷取,例如getString(R.string.laughs)。

支援string format

例如我們在strngs.xml中定義:<string name="c20_my_name">My name is %1$s %2$s</string>,裡面的預留位置號可以被變數替換,例如

String strFormat = getString(R.string.c20_my_name);String strResult = String.format(strFormat,"Tim","Martin");

那麼strResult則為:My name is Tim Martin。

rich Text

如果我們需要rich string,我們還可以通過HTML對格式進行定義,之前學習過的是通過webkit來顯示。然而我們也可以在TextView中顯示帶有Html格式。

例如:<string name="c20_rich_text">My name is &lt;b&gt;%1$s&lt;/b&gt;  &lt;i>%2$s&lt;/i&gt;</string>在程式中,我們將內容一個通過textview來顯示,一個通過顯示html格式的textview,最後一個通過webkit來顯示:

TextView lable = (TextView)findViewById(R.id.c20_lable);TextView lable2 = (TextView)findViewById(R.id.c20_lable2);WebView web = (WebView)findViewById(R.id.c20_web);String strFormat = getString(R.string.c20_rich_text);String strResult = String.format(strFormat,"Tim","Martin");String strResult2 = String.format(strFormat,TextUtils.htmlEncode("Tim"),                                  TextUtils.htmlEncode("Martin")); /* 上面,strResult和strResult2的結果都是一樣的My name is <b>Time<b> <i>Martin</i>  * 關鍵是下面setText(Html.fromHtml(strResult)),將一個簡單的HTML轉換為一個帶格式的文字物件 */lable.setText(strResult);lable2.setText(Html.fromHtml(strResult2));web.loadData(strResult, "text/html", "UTF-8");

2012.11.2補充:insiku:TextUtils.htmlEncode 是為了防止輸入的字串含有HTML的一些預留字元,比如< >
&, 這些字元在HTML中有特殊含義, 得轉換字元實體

圖片Picture

  圖片檔案可以是PNG,JPEG,和GIF,推薦使用PNG,不建議使用GIF,檔案放置在res/drawable/下,Android有三個檔案夾drawable-hdpi/drawable-mdpi/和drawable-ldpi對應不同的尺寸,實際上並沒有什麼太大的區別。假設檔案名稱為foo.png,則在資源XML檔案中名稱為@drawable/foo,在Java原始碼中該資源的ID則為R.drawable.foo。

   例子:將一個png檔案app_icon放到drawable中,我放入了drawable-hdpi/中,在Adroid XML檔案如下,運行結果,中間的書本icon就是我們的ImageButton,只需要通過android:src來指出圖片的位置。

......<ImageButton android:id="@+id/c20_format2"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:src="@drawable/app_icon"/>......

xml檔案

  xml檔案可以使用者儲存我們的資料,或者作為設定檔等。xml檔案可以位於res/xml目錄下面,例如我們在該目錄下放置一個xml檔案words.xml,如下:

<?xml version="1.0" encoding="utf-8"?><ListItems desrciption="Put the entry as the item in Android List"><Entry value="One" /><Entry value="Two" /><Entry value="Three" /><Entry value="Four" /><Entry value="Five" /><Entry value="Six" /><entry>Hello</entry></ListItems>

  XmlPullParser可以用於解釋xml檔案。這裡有兩種xml的常見格式:<entry>Hello</entry>和<Entry value="Six" />,在Android XML中使用後者,而這種方式在XmlPullParser中處理也非常方便。它的使用方式歸納如下:

  1. XmlPullParser通過next(),依次向下檢查
  2. XmlPullParser是事件驅動,如果檢測到END_DOCUMENT,應當停止繼續檢測
  3. XmlPullParser是事件驅動,當檢測到START_TAG,可以讀出<AAAA bbbb=xxxx c=yyyyy>的內容,其中AAAA可通過getName()來擷取,屬性的個數,可通過getAttributeCount()擷取,屬性的名詞和內容可分別通過getAttributeName(index)和getAttributeValue(index)來擷取。
  4. XmlPullParser是事件驅動,如果是END_TAG,則為</AAAA>,可以通過getName()來獲得AAAA的內容
  5. 對於<entry>Hello</entry>這種方式,如果要擷取中間的數值,則事件為XmlPullParser.TEXT,可通過getText()來擷取內容。
  6. 由於xml檔案可能書寫不正確,或者我們在解釋的過程中處理不正確,應當使用異常捕獲的方式來處理

下面的例子,我們將上述的words.xml分析處理,將Entry數值作為listActivity的每個item的內容。

/* 1. XmlPullParser通過next(),依次向下檢查 * 2. XmlPullParser是事件驅動,如果檢測到 END_DOCUMENT,應當停止繼續檢測 * 3. XmlPullParser是事件驅動,當檢測到START_TAG,可以讀出<AAAA bbbb=xxxx c=yyyyy>的內容,其中AAAA可通過getName()來擷取,屬性的個數,可通過getAttributeCount()擷取,屬性的名詞和內容可分別通過getAttributeName(index)和getAttributeValue(index)來擷取。 * 4. XmlPullParser 是事件驅動,如果是END_TAG,則為</AAAA>,可以通過getName()來獲得AAAA的內容 * 5. 對於<entry>Hello</entry>這種方式,如果要擷取中間的數值,則事件為XmlPullParser.TEXT, 可通過getText()來擷取內容。 * 6. 由於xml檔案可能書寫不正確,或者我們在解釋的過程中處理不正確,應當使用異常捕獲的方式來處理*/public class Chapter20Test3 extends ListActivity{private ArrayList<String> items = new ArrayList<String>();protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*步驟1:進行特定xml檔案words的解析,對應第6點,應採用異常捕獲防止程式出錯*/ try{/* 步驟2:擷取xml檔案,並給給出XmlPullParser對象*/  XmlPullParser xpp = getResources().getXml(R.xml.words);/* 步驟3:通過迴圈,逐步解析XML,直至xml檔案結束,對應第1點和第2點*/ while(xpp.getEventType()!=XmlPullParser.END_DOCUMENT){/* 步驟4:擷取目標ListItems的解析,並將之用method:ListItems來處理,對應第3點 */if(xpp.getEventType() == XmlPullParser.START_TAG){if(xpp.getName().equals("ListItems")){getItems(xpp);}}xpp.next();}}catch(Throwable t){Toast.makeText(this, "Failed:" + t.toString(), 2000).show();}setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items));}/* 解析<ListItems ... >.... </Listitem>的內容,擷取每個entry的value的值,注意對異常的處理*/private void getItems(XmlPullParser xpp) throws Throwable{while(true){xpp.next();/*<ListItems> ...</ListItems>的內容已經檢索完畢,或者檔案結束,都退出處理*/if((xpp.getEventType() == XmlPullParser.END_TAG && xpp.getName().equals("ListItems"))   || xpp.getEventType() == XmlPullParser.END_DOCUMENT)break;if(xpp.getEventType()==XmlPullParser.START_TAG) {/*觀測點:對第3點的處理,讀出屬性的名字和數值*/if(xpp.getName().equals("Entry")){for(int i = 0; i < xpp.getAttributeCount() ; i ++){if(xpp.getAttributeName(i).equals("value")){items.add(xpp.getAttributeValue(i));}}}/*觀測點:對第5點的處理,處理<name>value</name>*/if(xpp.getName().equals("entry")){xpp.next();if(xpp.getEventType()==XmlPullParser.TEXT)items.add(xpp.getText());}}}}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);Toast.makeText(this, items.get(position), Toast.LENGTH_LONG).show();}}

相關連結:
我的Android開發相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.