[Android] 要學會的關鍵技術—XML的讀取(3)

device-2012-03-23-142254

系列文章:

[Android] 要學會的關鍵技術—XML的讀取(1) 

[Android] 要學會的關鍵技術—XML的讀取(2) 

[Android] 要學會的關鍵技術—XML的讀取(3)

 


講完技術性的東西之後,最後就是把它設定起來

 

版面檔 main.xml

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

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

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

 

    <TextView

        android:id="@+id/textView1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="讀取RSS新聞標題:" />

 

    <LinearLayout

        android:id="@+id/linearLayout1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" >

 

        <EditText

            android:id="@+id/trg_url"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:hint="請輸入RSS網址"

            android:text="http://tw.news.yahoo.com/rss/travel"

            android:singleLine="true">

 

            <requestFocus />

        </EditText>

 

        <Button

            android:id="@+id/get_data"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="取得" />

    </LinearLayout>

 

    <ScrollView

        android:layout_width="match_parent"

        android:layout_height="match_parent" >

 

        <TextView

            android:id="@+id/result_txt"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content" />

    </ScrollView>

 

</LinearLayout>

 

主程式 Main.java

 

package com.J_Test.XMLParserTest;

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import com.J_Test.XMLParserTest.Module.SimpleXMLParser;
import com.J_Test.XMLParserTest.ParsingHandler.RssNewsXMLParsingHandler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 

public class Main extends Activity implements OnClickListener

{

     private static final String TAG = “XMLParserTest”;

     /** 「要更新版面」的訊息代碼 */

     protected static final intREFRESH_DATA = 0x00000001;

     /** Rss資料的網址 */

     String trgUrl;

     /** 新聞資料的物件陣列 */

     RssNews[] Arr_RssNews;

     private Button getData_btn;
     private TextView result_edtxt;
     private EditText trgUrl_txt;

     /** 建立UI Thread使用的Handler,來接收其他Thread來的訊息 */

     Handler mHandler = new Handler()

     {

           @Override

           public void handleMessage(Message msg)

           {

                switch (msg.what)

                {

                // 更新資料,將Rss新聞的標題用迴圈依序印出來

                case REFRESH_DATA:

                     result_edtxt.setText(“”);

                     for (int i = 0; i < Arr_RssNews.length; i++)

                     {

                           result_edtxt.append(Arr_RssNews[i].getTitle() + “n”);

                     }

                     break;

                }

           }

     };

 

     /** Called when the activity is first created. */

     @Override

     public void onCreate(Bundle savedInstanceState)

     {

           super.onCreate(savedInstanceState);

           setContentView(R.layout.main);

           // 版面初始化

 

           getData_btn = (Button) findViewById(R.id.get_data);
           result_edtxt = (TextView) findViewById(R.id.result_txt);
           trgUrl_txt = (EditText) findViewById(R.id.trg_url);
           getData_btn.setOnClickListener(this);

     }

     @Override

     public void onClick(View v)

     {

           // 若是按下getData_btn的按鈕

           if (v == getData_btn)

           {

                // 擷取trgUrl_txt文字框裡的內容

                trgUrl = trgUrl_txt.getEditableText().toString();

                // 開一個執行緒(Thread)

                new Thread()

                {

                     @Override

                     public void run()

                     {

                           Arr_RssNews = getRssNews();

                           if (Arr_RssNews != null)

                                 // Handler上發出「要更新版面」的訊息

                                 mHandler.sendEmptyMessage(REFRESH_DATA);

                     }

                 }.start();

            }

      }

 

     /**
      * 從網路擷取RSS的資料(需要搭配執行緒)
      * @return Rss新聞的物件陣列
      */

     public RssNews[] getRssNews()

     {

           if (trgUrl == null)

                return null;

           try

           {

                // 建立一個Parser物件,並指定擷取規則 (ParsingHandler)

                SimpleXMLParser dataXMLParser = new SimpleXMLParser(

                new RssNewsXMLParsingHandler());

                // 呼叫getData方法取得物件陣列

                Object[] data = (Object[]) dataXMLParser.getData(trgUrl);

                if (data != null)

                {

                     // 如果資料形態正確,就回傳

                     if (data[0] instanceof RssNews[])

                     {

                           return (RssNews[]) data[0];

                     }

                }

           } catch (SAXException e)

           {

                e.printStackTrace();

           } catch (IOException e)

           {

                e.printStackTrace();

           } catch (ParserConfigurationException e)

           {

                e.printStackTrace();

           }

           // 若有錯誤則回傳null

           return null;

     }

}

 


呼….結束了。

什麼?你又忘了!

再給我忘記這句

<uses-permission android:name="android.permission.INTERNET" />

我就搥你

 

參數設定檔 AndroidManifest.xml

<?xml version=“1.0” encoding=“utf-8”?>

<manifest xmlns:android=“http://schemas.android.com/apk/res/android”

    package=“com.J_Test.XMLParserTest”

    android:versionCode=“1”

    android:versionName=“1.0” >

 

    <uses-sdk

        android:minSdkVersion=“8”

        android:targetSdkVersion=“17” />

    <uses-permission android:name=“android.permission.INTERNET” />

    <application

        android:allowBackup=“true”

        android:icon=“@drawable/ic_launcher”

        android:label=“@string/app_name”

        android:theme=“@style/AppTheme” >

        <activity

            android:name=“com.J_Test.XMLParserTest.Main”

            android:label=“@string/app_name” >

            <intent-filter>

                <action android:name=“android.intent.action.MAIN” />

                <category android:name=“android.intent.category.LAUNCHER” />

            </intent-filter>

        </activity>

    </application>

</manifest>

 

 

在〈[Android] 要學會的關鍵技術—XML的讀取(3)〉中有 3 則留言

  1. 不好意思版主
    冒昧的想請教一下
    我是最近才學完JAVA的ANDROID的新手
    是否能推薦幾本書籍給新手當推薦呢?

  2. 你好! 很感謝你的文章讓我了解如何讀取XML RSS
    但不知可否跟你請教一下
    1.可以教學一下將部分部分資料分開存放排列LAYOUT嗎?
    我抓下的資料都會擠在一起
    2.能否在抓取方面做詳細點介紹?
    辛苦您了

  3. 感謝大大寫這系列Android讀取Rss的方法、受益良多。
    如果沒這篇文章、小弟可能還在拼湊REs然後試圖自己解Rss。

留言功能已關閉。