- ベストアンサー
Android用RSSリーダーアプリ開発について
- Android用RSSリーダーアプリの開発については、以下のサイトを参考にしながら制作しています。
- 画像挿入の際にエラーが発生していますが、コメントアウトすることでテキストのみで正しく表示されます。
- マニフェストに記載すべき文が抜けているかもしれませんが、詳細な原因は分かりません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
だいぶ流れが見えてきました。基本的にはすっきり設計されているようですね。おそらく、Itemでのデータの保管の仕方と、質問に出てきたprofileImageView.setImageDrawable(icons[position]);の部分がうまくつながっていないのだろうと思います。 現在、Itemクラスでは、mImageはStringになっていますね? これは、currentItem.setImage(parser.getAttributeValue(null,"url"));となっていますから、おそらくはURLのStringを保管しているのだと思います。となれば、この保管しているURLをもとに、いかにしてイメージを生成し、ImageViewを作成して画面にはめこむか、ということになります。 質問にあったURLを見ましたが、RssListAdapterクラスを定義して、そこでgetViewメソッドで各項目のViewを作っていますが、ここでイメージを表示させたいのですか(つまり一覧リストのところ)。それともItemDetailActivityのところで表示させるのですか(つまり詳細表示のところ)。 RssListAdapterのgetViewでリストの各項目にイメージを埋め込むとなると、このViewの中にうまくイメージまではめ込まれるように設計しないといけません。これは、item_row.xmlの定義を修正してImageViewまで含めて表示する形に修正する必要があるでしょう。そして、getViewのif (item != null) {~のところで、ItemのgetImageで得たURLをもとにイメージを作成します。つまり、ここで前に回答したようなイメージ生成の処理を用意し、ImageViewに設定するわけです。 もし詳細表示のところというなら、ItemDetailActivityクラスのonCreateで、URLを受け取りイメージを生成する形になります。この場合、item_detail.xmlを修正してImageViewが表示されるようにしておきます。また、RssReaderActivityのonListItemClickでIntentを起動するところで、intent.putExtra("IMAGEURL", item.getImage());というようにしてイメージのURLをインテントに渡し、それをItemDetailActivityのonCreateでString imgurl = intent.getStringExtra("IMAGEURL");というようにして受け取る必要があります。 以上、どこに表示するかで修正する部分は違ってきます。概要はこれでおわかりでしょうか?
その他の回答 (3)
サイトを参考にされていると言っても、そのままコードをコピーしても動くわけではないですから、そちらのプログラム用にアレンジして書いてあるはずですね。 指定のURIからXMLデータを取得し、パースされて得られたオブジェクトを元に記事の内容をとり出し書き出している部分があるはずです。そこの処理はどうなっているでしょうか。その部分で、イメージのURI情報を取得し、そこからイメージを取り出してImageViewを作って画面にはめ込む、という処理を追加することになると思います。
お礼
お世話になっております。 パースの部分は、 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 ・ ・ ・ ・ } else if ("enclosure".equals(tag)) { currentItem.setImage(parser.getAttributeValue(null,"url")); } となっております。 TwitterStatus(ここではItem)クラスは、 public class Item { // 記事の画像 private String mImage; ・ ・ ・ // 記事の画像 public String getImage() { return mImage; } public void setImage(String mImage) { this.mImage = mImage; } となっております。 URLの指定は、 private final String RSS_FEED_URL = "http:~~~~~~"; ・ ・ ・ RssParserTask task = new RssParserTask(this, mAdapter); task.execute(RSS_FEED_URL); となっております。 なんとなく流れはつかめるのですが、 なぜ Sorry! the application XXXX has stopped unexpectedly.Please try again. このようなエラーがでるのかが分かりません。
>ということは、 >http://d.hatena.ne.jp/YasushiIizuka/searchdiary?word=Twitter >こちらのサイトが誤っていたということでしょうか。 そっちのサイトの方は確認していなかったんで見てみました。こちらも、間違っていません。勘違いをされているようです。URLのサイトでは、イメージを取得しているのはコンストラクタの部分です。質問の2文は、単にリソースからImageViewを生成し、(コンストラクタで既に生成済みの)イメージを設定しているのです。つまり、質問の2文でイメージを作成しているわけではないのです。 URLのサイトを参考にされるのでしたら、以下の部分がイメージを取得しているところになります。これはDrawableを使っていますね。私が先の回答で示したのはBitmapを使ったやり方です。 icons = new Drawable[items.size()]; for (int i = 0; i < items.size(); i++) { TwitterStatus item = (TwitterStatus) items.get(i); try { URL url = new URL(item.getProfileImageUrl()); icons[i] = Drawable.createFromStream((InputStream)url.getContent(), ""); } catch (MalformedURLException e) { Log.e("--ACL--", e.getMessage()); } catch (IOException e) { Log.e("--ACL--", e.getMessage()); } } >上記のコードをどこに挿入すればよいのかが分かりません。 全体のコードがわからないとなんともいえないのですが……。 RSSからテキストを取得して表示している部分は既にちゃんと動いているのですよね? ならば、テキストを表示している部分の後で、イメージを生成しImageViewを作成する処理を追加すれば良いと思います。
お礼
good-failure様 お世話になっております。 ご回答誠にありがとうございます。 http://d.hatena.ne.jp/YasushiIizuka/searchdiary?word=Twitter TwitterAdapterクラスに関しては、 こちらのサイト様とほぼ同じようにコードを打ち込んでいるのですが、 エミュレーターでテストしたところ、エラーが出てしまいます。 (exlipseではエラーは出ません) TwitterStatus.javaは public class TwitterAdapter { // 記事のタイトル private String mTitle; // 記事の本文 private String mDescription; // 記事のリンク private String mLink; // 記事の画像 private String mImage; public String getTitle() { return mTitle; } public void setTitle(String mTitle) { this.mTitle = mTitle; } ・ ・ ・ ・ public String getProfileImageUrl() { return mImage; } public void setProfileImageUrl(String mImage) { this.mImage = mImage; } このようになっております。 (xmlパーサーで、記事画像のURLを取得しております) Activityに関しては、 http://itpro.nikkeibp.co.jp/article/COLUMN/20100105/342883/?ST=android-dev&P=1 こちらのサイト様を参考にコードを記述しております。 twitter_row.xmlのImageViewは <ImageView android:id="@+id/prifile_image_url" android:layout_width="100px" android:layout_height="100px" android:layout_marginRight="3dip" android:background="#FFFFFF" /> このようになっております。 なにか勘違いをしているかもしれません。 お手間を取らせて大変恐縮ですが、ヒントをいただけると幸いです。
ImageView profileImageView = (ImageView)view.findViewById(R.id.prifile_image_url); if (icons != null) profileImageView.setImageDrawable(icons[position]); これは、あらかじめ用意されているリソースからprifile_image_urlというイメージを取得し表示する、というものです。そういうことを行いたいのでしょうか。だとすると、prifile_image_urlというリソースイメージが用意されていないということだと思います。そのあたりを確認してみてください。 もし、XMLデータから取得したURLなどをもとにイメージを表示させたい、ということであれば、findViewByIdではできませんストリーム経由でビットマップイメージをダウンロードし表示する、という感じになるように思います。例えば、下のような感じで、XMLから取得したアドレスからイメージをダウンロードしImageViewに表示する、という感じになるように思います。 Bitmap bm = null; try { URL aURL = new URL( イメージのURIを指定する ); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (IOException e) { } ImageView image = new ImageView(this); image.setImageBitmap(bm); 動作確認してないので書き間違いなどあったらご容赦を。
お礼
good-failure様 お世話になります。 ご回答ありがとうございます。 ということは、 http://d.hatena.ne.jp/YasushiIizuka/searchdiary?word=Twitter こちらのサイトが誤っていたということでしょうか。 あと、 Bitmap bm = null; try { URL aURL = new URL( イメージのURIを指定する ); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (IOException e) { } ImageView image = new ImageView(this); image.setImageBitmap(bm); 上記のコードをどこに挿入すればよいのかが分かりません。 Activityの下に挿入するのかな? と思ったので色々試してみましたが、上手くいきませんでした。 初歩的な質問で申し訳ございません。
お礼
good-failure様 お世話になります。 ご丁寧なご回答をありがとうございました! good-failure様のアドバイスをヒントに、ようやく画像を表示させることができました。 どうやらわたしは大きな勘違いをしていたようです。 本当にありがとうございました!