プログラミング初心者でも簡単にできる「初めてのAndroidアプリ開発」【その3】

こんにちは。株式会社ガラパゴスAndroidチームの@rockmanstreemです。
この記事はすぐに上げる予定でしたが遅くなってしまい申し訳ないです。
今回でこのアプリはとりあえず完成ということになります。完成したアプリのソースも添付しておくので良かったらダウンロードして下さい。

Rssの記事タイトルを表示させる

本題のRssの表示をやっていきたいと思います。
一般的なRSS(2.0)のファイルは次のようなXML形式のフォーマットで記述されています。

<ヘッダ記述>
<rss>
  <channel>
    <title>RSSファイルのサイトの名前</title>
    <link>サイトのURL</link>
    <description>サイトの説明文</description>
    <item>
      <title>記事1のタイトル</title>
      <link>記事1のURL</link>
      <description>記事1の概略</description>
   <category>記事1のカテゴリー</category>
      <pubDate>記事1の発行日</pubData>
    </item>
    <item>
      <title>記事1のタイトル</title>
      <link>記事1のURL</link>
      <description>記事1の概略</description>
   <category>記事1のカテゴリー</category>
      <pubDate>記事1の発行日</pubData>
    </item>
    .
    .
  </channel>
</rss>

実際にはさらに多くの要素があるのですがここでは省略しています。
今回は記事のタイトルをListViewに表示するために、item要素のなかのtitle要素を取り出します。
そのための記述を追加していきます。

ListViewを使おう

じつはリストビューはこのままでは使用できません。リストビューには別にレイアウトが必要なのです。
画面左のプロジェクトエクスプローラーから[layout]フォルダの上で右クリックをして
「新規」→「その他」と選択して「Android」→「Android XML File」を選択します。
ファイル名を「list.xml」 Select the root element for the XML file: TextViewとして「完了」をクリックします。

これでlayoutフォルダに「list.xml」が出来ていると思います。
今回は文字を表示するだけなのでこのlist.xmlに手を加えることはありませんが、文字だけでなく画像などを一緒に表示させたい場合などはこれを変更していくことになります。

次にRssList.javaの方にListViewを使うための記述をします。

まずListViewを使用するための変数を宣言します。リストビューに表示させるデータは「アダプター」と呼ばれるものに格納します。アダプターにデータを追加していき、そのアダプターをリストビューにセットするといった流れです。

また記事のリンク先も同時に格納しておく必要があります。そのためListコレクションを宣言します。
Listコレクションは、String型のデータを格納する配列ArrayListとして作成します。

またボタンやエディットテキストを使った時と同じようにfindViewByIdメソッドで変数に代入し、アダプターも作成します。
これはonCreateメソッドに記述をします。

public class RssList extends Activity {

	//リストビューlistViewDataの宣言
	ListView listViewData;
	//アダプターadapterの宣言
	ArrayAdapter<String> adapter;
	//リンク先を格納するlistLinkの宣言
	List<String> listLink = new ArrayList<String>();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //レイアウト上のrssListを変数rssListに代入
        rssList = (ListView)findViewById(R.id.rssList);
        //アダプターの作成
        adapter = new ArrayAdapter<String>(this,R.layout.list);
    }
(以下省略)

XmlPullParserを使ってRSSを取得する

次にRssファイルを取得してそれをadapterにセットしていく部分を記述します。Rssファイルはxmlデータでこれを取得するのに非常に便利なクラスとして「XmlPullParser」クラスがあります。
次にshowRSSメソッドを以下のように変更。コメントで説明を入れているのでここでは省略。

public void showRSS(View view){
    	
    	//レイアウト上のurlEditTextを変数editTextURLに代入
    	EditText urlEditText = (EditText)findViewById(R.id.urlEditText);
    	//editTextURLに入力されたURLを取り出し、変数rssURLに代入
    	String rssURL = urlEditText.getText().toString();
    	
    	
    	//XmlPullParserクラスの変数xmlPullParserを作成
    	XmlPullParser xmlPullParser = Xml.newPullParser();
    	
    	//RSSデータを入れる変数rssDataを宣言
    	String rssData = "";
    	try{
    		//入力されたURLからURLクラスのオブジェクトを生成
    		URL url = new URL(rssURL);
    		//URLの内容をXmlPullParserで開く。UTF-8コードとして開く。
    		xmlPullParser.setInput(url.openStream(),"UTF-8");
    		//変数rssDataEventの宣言
    		int rssDataEvent;
    		//itemタグのチェック。記事のタイトルだけを取り出すため。
    		boolean isItem = false;
    		
    		//END_DOCUMENTになるまでイベント単位でデータを取り出す。
        /*XmlPullParserはXMLデータを「イベント」という単位で解析を行う。
「<title>XmlPullParserについて</title>」という場合、「<title>」「XmlPullparserについて」「</title>」という3つのイベントとして扱う。「<title>」はSTART_TAG、「XmlPullparserについて」はTEXT、「</title>」はEND_TAGとなっている*/
    		while((rssDataEvent = xmlPullParser.next()) != XmlPullParser.END_DOCUMENT){
    			//イベントタイプが開始タグならタグの名前を調べる
    			if(rssDataEvent == XmlPullParser.START_TAG){
    				//タグの名前がitemであればitemタグ開始
    				if(xmlPullParser.getName().equals("item")){
    					isItem = true;
    				}
    				//item要素のなかの要素をチェック
    				if(isItem){
    					if(xmlPullParser.getName().equals("title")){
    						//タグの名前がtitleであればアダプターに要素を追加
    						adapter.add(xmlPullParser.nextText());
    					} else if(xmlPullParser.getName().equals("link")){
    						//タグの名前がlinkであればlistLinkに追加
    						listLink.add(xmlPullParser.nextText());
    					}
    				}
    			} else if(rssDataEvent ==XmlPullParser.END_TAG){
    				//終了タグの名前がitemであればitemタグ終わり
    				if(xmlPullParser.getName().equals("item")){
    					isItem = false;
    				}
    			}
    		}
    	} catch(Exception e){
    		//オープン時のエラーメッセージをrssDataに代入
    		rssData  = "open error: " + e.toString();
    	}
    	//レイアウト上のTextViewを変数textViewDataに代入
    	TextView textViewData = (TextView)findViewById(R.id.textView1);
    	//textViewDataに変数rssURLの値をセット
    	textViewData.setText(rssData);
    	
    	//アダプターをリストビューにセット
    	listViewData.setAdapter(adapter);
    }

これでプログラムの記述は終わりました。しかしこの状態でアプリを実行してみてもrssを取得することはできません。
それはこのアプリにインターネットに接続する許可を与えていないからです。それではこの部分を変更しましょう。

AndroidManifestファイルを変更する。

インターネットへの接続を許可するためにAndroidManifestファイルを変更していきます。
プロジェクトエクスプローラから「AndroidManifest.xml」を開いて下さい。
おそらく以下のような画面が開かれると思います。

ここから下にあるタブのなかで「許可」の部分をクリックして下さい。
開いたら次に四つあるボタンの中から「追加」を押して下さい。
すると以下のような画面が出てくると思いますので、一番下の「Uses Permission」を選択してOKをクリックして下さい。

するとリストの中にUses Permissionが追加され、右側でNameを選べるようになると思います。
その中から「android.permission.INTERNET」を選択して保存して下さい。すると以下のようになりこれでアプリがインターネットに接続できるようになりRSSが取得できるようになります。


これで簡単なRssリーダーアプリの完成です。
こちらが完成したアプリのソースです。eclipseからinportを選択してこのファイルをインポートしてもらえば大丈夫だと思います。

SampleRssReader.zip 直
今後もandroidアプリについて記事を書いていきたいと思いますのでよろしくお願いします。