技術的メモ

個人的な備忘録として記録を残していきます

RSS Readerアプリ作成4日目

本日も前回までの続きを作成していきます。(・ω<)
記事は以下を参照。
Androidで広がる、携帯アプリ開発の世界 - 第6回 詳細画面を付けて、簡易RSSリーダーの完成:ITpro

以下のように入力してきましたがメニュー関係がうまく動いてくれません(´・ω・`)

package jp.hatenadiary.amatuka.simplerssreader;

import java.util.ArrayList;

import android.os.Bundle;
import android.view.View;//追加
import android.widget.ListView;
import android.app.ListActivity;//追加
import android.content.Intent;

public class RssReaderActivity extends ListActivity {
	public static final String RSS_FEED_URL = "http://itpro.nikkeibp.co.jp/rss/ITpro.rdf";
	private ArrayList<Item> mItems;
	private RssListAdapter mAdapter;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_rss_reader);
    	
    	mItems = new ArrayList<Item>();
    	mAdapter = new RssListAdapter(this, mItems);
    	RssParserTask task = new RssParserTask(this, mAdapter);
    	task.execute(RSS_FEED_URL);
    	/*
    	setListAdapter(mAdapter);
    	
    	for ( int i = 0; i < 10; i++) {
    		mAdapter.add(new Item());
    	}
    	*/
    }
//ここから追加
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    	Item item = mItems.get(position);
    	Intent intent = new Intent(this, ItemDetailActivity.class);
    	intent.putExtra("TITLE", item.getTitle());
    	intent.putExtra("DESCRIPTION",  item.getDescription());
    	startActivity(intent);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	boolean result = super.onCreateOptionsMenu(menu);
    	menu.add(0, MENU_ITEM_RELOAD, 0, "更新");
    	return result;
    }
//ここまで追加
    
}
<?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="wrap_content"
    android:orientation="vertical" >
    <TextView 
        android:id="@+id/item_detail_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:background="@android:drawable/dark_header" />
    <TextView 
        android:id="@+id/item_detail_descr"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="jp.hatenadiary.amatuka.simplerssreader.RssReaderActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity 
            android:name=".ItemDetailActivity">
        </activity>
    </application>

明日は仕事なのでまた明日原因を突き止めます(・ω<)

RSS Readerアプリ作成3日目

前回に引き続き下記の記事の通り作成していきたいと思います。
Androidで広がる、携帯アプリ開発の世界 - 第5回 RSSリーダーの要、パース機能を知る:ITpro

前回記事の通り入力したと思ったのになぜか起動はするけど何も起こらない状態になってしまいました(´・ω・`)

そこで、何がダメだったのか確認するためにLogCatを見てみることにします。

すると「java.lang.SecurityException: Permission denied (missing INTERNET permission?)」
のようにエラーが出ていました。

どうやらインターネットを利用する権限がないようです。
たしか、AndroidManifestに記載したはずだったのにと思って見てみると以下のようになっていました。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.hatenadiary.amatuka.simplerssreader"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET" android:maxSdkVersion="18"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="jp.hatenadiary.amatuka.simplerssreader.RssReaderActivity"
            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:maxSdkVersion="18"」の部分がどんな意味なのかわからなかったので調べてみるとどうやらこのアプリが動作する最大のAPIを指しているようです。

ということで、自分が利用しているエミュレータAPIレベルを確認してみたところ19になっていたのでAndroidManifestの方も19に合わせてみたところ無事に動作しました。
f:id:amatuka:20140118000513j:plain

RSS Readerアプリ作成2日目

今回は前回途中まで作成したRSS Readerの続きを作成してみます。
記事は以下
Androidで広がる、携帯アプリ開発の世界 - 第5回 RSSリーダーの要、パース機能を知る:ITpro

とりあえずRssParserTask.javaを作成していきます。

package jp.hatenadiary.amatuka.simplerssreader;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Xml;

public class RssParserTask extends AsyncTask<String, Integer, RssListAdapter> {
	private RssReaderActivity mActivity;
	private RssListAdapter mAdapter;
	private ProgressDialog mProgressDialog;
	
	public RssParserTask(RssReaderActivity activity, RssListAdapter adapter) {
		mActivity = activity;
		mAdapter = adapter;
	}
	
	@Override
	protected void onPreExecute() {
		mProgressDialog = new ProgressDialog(mActivity);
		mProgressDialog.setMessage("Now Loading...");
		mProgressDialog.show();
	}
	
	@Override
	protected RssListAdapter doInBackground(String... params) {
		RssListAdapter result = null;
		try {
			URL url = new URL(params[0]);
			InputStream is = url.openConnection().getInputStream();
			result = parseXml(is);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	@Override
	protected void onPostExecute(RssListAdapter result) {
		mProgressDialog.dismiss();
		mActivity.setListAdapter(result);
	}
	
	public RssListAdapter parseXml(InputStream is) throws IOException, XmlPullParserException {
		XmlPullParser parser = Xml.newPullParser();
		try {
			parser.setInput(is, null);
			int eventType = parser.getEventType();
			Item currentItem = null;
			while (eventType != XmlPullParser.END_DOCUMENT) {
				String tag = null;
				switch (eventType) {
				case XmlPullParser.START_TAG:
					tag = parser.getName();
					if (tag.equals("item")) {
						currentItem = new Item();
					} else if (currentItem != null) {
						if (tag.equals("title")){
							currentItem.setTitle(parser.nextText());
						} else if (tag.equals("description")) {
							currentItem.setDescription(parser.nextText());
						}
					}
					break;
				case XmlPullParser.END_TAG:
					tag = parser.getName();
					if (tag.equals("item")) {
						mAdapter.add(currentItem);
					}
				break;
				}
				eventType = parser.next();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return mAdapter;
	}

}

RssReaderActivity.javaも以下のように追加する。

package jp.hatenadiary.amatuka.simplerssreader;

import java.util.ArrayList;
import android.os.Bundle;
import android.app.ListActivity;

public class RssReaderActivity extends ListActivity {
	public static final String RSS_FEED_URL = "http://itpro.nikkeibp.co.jp/rss/ITpro.rdf"; //追加
	private ArrayList<Item> mItems;
	private RssListAdapter mAdapter;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_rss_reader);
    	
    	mItems = new ArrayList<Item>();
    	mAdapter = new RssListAdapter(this, mItems);
    	RssParserTask task = new RssParserTask(this, mAdapter); //追加
    	task.execute(RSS_FEED_URL);//追加
    }   
}

上記のように入力してみたのですがちゃんと動いてくれません(´・ω・`)

明日は動くようにがんばります(・ω<)

いつもの牛丼

我が家でいつも作っている牛丼のレシピです。
これは美味しい!「牛丼」 by rey* [クックパッド] 簡単おいしいみんなのレシピが162万品

普段は基本的になるべく残業をせずにほぼ定時に帰れるように仕事をしていますが、
今日は久しぶりに残業しました(T_T)

クタクタに疲れて家に帰るといつもの牛丼が待っていました(・∀・)

ということで今日はこれにて就寝です(・ω<)

RSS Readerのアプリ

以下の記事を参考に作ってみることにした。
Androidで広がる,携帯アプリ開発の世界 - 第4回 簡単なRSSリーダーを作ってみる:ITpro


若干、記事の内容と違う箇所もあったが概ね同じ感じに入力して早速実行してみると
「Unfortunately,(アプリ名) has stopped.」とエラーが出て起動しない・・・(´・ω・`)

エラー内容をググってみるとLogCatにエラーが出ている模様。
というわけで早速LogCatを見てみると作成したアプリから大量にエラーが・・・

その中に以下のようなエラーがありました。
「Your content must have a ListView whose id attribute is 'android.R.id.list'」
要するにListViewを利用する場合はIDを @+id/android:listしないといけないみたいです。

そこで、作成した「activity_rss_reader.xml」を見てみると
ちゃんと指定されているみたいです(´・ω・`)

activity_rss_reader.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".RssReaderActivity" >

    <ListView
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </ListView>

    <TextView
        android:id="@+id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        >

        <requestFocus />
    </TextView>

</LinearLayout>

デフォルトで入っていた値にGUIで付け足して作成したのですが、
何がダメなのかわかりません_| ̄|○

ということで、記事にある通り以下のように手書きで作り変えてみました。

<?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">
	<ListView
		android:id="@android:id/list"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" />
	<TextView
		android:id="@android:id/empty"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" />
</LinearLayout>

それで、実行してみると無事に動くようになりました。
マウスで、ドラッグすると上下します。
f:id:amatuka:20140114234953j:plain

また、明日以降続きをがんばるぞ~(・ω<)

【2014】今年の抱負

今年もはや2週間が過ぎようとしていますが、
今年の目標を立てました。

といっても、毎年なかなか実行できていませんが(^_^;)
というわけで今年はAndroidアプリを作成しストアに上げたいと思います。

その他にも本業のネットワークの知識もまだまだ学習することがあるので頑張らないといけません(´・ω・`)
いつもやりたいことがありすぎて中途半端になってしまうので
ここまでやるぞ~っていう目標を決めてそれを達成していきたいと思います。

それと、春に情報セキュリティも取得したいと思います。
前回の秋季試験の時ホントはネスペを受けようと思っていたのですが
忙しくて申し込みを忘れていて春季に受ければいいかぁと思っていたのに
春の試験ではネスペはありませんでした(・ω<)
というわけでネスペの次に興味のある情報セキュリティを受けようと思います。

とりあえずこの2つを目標に今年も頑張っていきます。