ユーザーID パスワード

技術情報

  • FAQ よくある質問
  • 個人ユーザー向けサービスのお手続きについて

コード&コラム

第4回
通信するアプリを作ってみよう(後編)


前へ 1 |2 |3 |4

Step3 ボタンの配置とブラウザ呼び出し

さて、「Step1 XML解析」で確認してもらうとわかるように、今回使用したYahoo! JAPAN® 提供のWeb APIでは取得した記事に対応したスマートフォン用のURLが取得することが出来ます。

そこで、取得した記事毎にボタンを設置し、そのボタンが押されたらブラウザを起動して記事のURLを開くというアプリケーションの作成を行いたいと思います。

今回のプログラムの流れは、はじめに取得したXMLファイルを解析し、記事のタイトルとURLを取得する、次に記事のタイトルとURLに関連付けられたボタンを表示する、ボタンが押されたら対応するURLをブラウザで開く、という物になります。

メンバ変数は記事に対応したURLを格納するmArticleURLを加えた以下の3つとなります。

        static private String mArticleTitle[];
        static private String mArticleURL[];
        static private int mArticleNum;

XMLファイルの解析を行うreadXMlは、String配列の確保にmArticleURL を加え、タグの内容がSmartphoneUrlだった場合にその内容を保存する処理を加えます。

        public static void readXML(InputStream stream)
                        throws XmlPullParserException {
                try {
                        XmlPullParser myxmlPullParser = Xml.newPullParser();
                        myxmlPullParser.setInput(stream, "UTF-8");

                        int cntTitle = 0;
                        int cntAddress = 0;
                        for (int e = myxmlPullParser.getEventType(); e != XmlPullParser.END_DOCUMENT; e = myxmlPullParser
                                        .next()) {
                                if (e == XmlPullParser.START_TAG) {
                                        if (myxmlPullParser.getName().equals("ResultSet")) {
                                                mArticleNum = Integer
                                                                .parseInt(myxmlPullParser.getAttributeValue(
                                                                                null, "totalResultsReturned"));
                                                mArticleTitle = new String[mArticleNum];
                                                mArticleURL = new String[mArticleNum];
                                        } else if (myxmlPullParser.getName().equals("Title")) {
                                                mArticleTitle[cntTitle] = myxmlPullParser.nextText();
                                                cntTitle++;
                                        } else if (myxmlPullParser.getName()
                                                        .equals("SmartphoneUrl")) {
                                                mArticleURL[cntAddress] = myxmlPullParser.nextText();
                                                cntAddress++;
                                        }
                                }

                        }
                } catch (XmlPullParserException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

ListView内で扱う要素が記事のタイトルとURLになるためそれに対応したクラスListItemを作成します。

        public class ListItem {
                public String title;
                public String url;

                public ListItem(String title, String url) {
                        this.title = title;
                        this.url = url;
                }
        }

ListViewでListItemを扱うためにArrayAdapterを拡張したListArrayAdapterクラスを作成します。

        public class ListArrayAdapter extends ArrayAdapter<ListItem> implements
                        View.OnClickListener {
                private ArrayList<ListItem> listItem;

                public ListArrayAdapter(Context context, ArrayList<ListItem> listItem) {
                        super(context, R.layout.rowitem, listItem);
                        this.listItem = listItem;

                }

                @Override
                public View getView(int position, View view, ViewGroup parent) {
                        (1) レイアウトの指定
                        ListItem item = listItem.get(position);
                        Context context = getContext();
                        LinearLayout linearLayout = new LinearLayout(context);
                        view = linearLayout;
                        TextView textView = new TextView(context);
                        textView.setText(item.title);
                        linearLayout.addView(textView);
                        Button button = new Button(context);
                        button.setText("GO");
                        button.setTag(String.valueOf(position));
                        button.setOnClickListener(this);
                        linearLayout.addView(button, 0);
                        return view;
                }

                public void onClick(View view) {
                        // (2) クリックによる動作
                        int tag = Integer.parseInt((String) view.getTag());
                        ListItem item = listItem.get(tag);
                        try {
                                Intent intent = new Intent("android.intent.action.VIEW", Uri
                                                .parse(item.url));

                                startActivity(intent);
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
        }

(1) レイアウトの指定
    ここではボタンの配置やレイアウトの指定を行っています。

(2) クリックによる動作
    ここではクリックによる動作を指定して居ます。
    view.getTagによってクリックされた列に対応するタグを取得し、 listItem.getでそのタグを引数とすることで列に対応したListItemを取得します。
     取得したListItemのURLを利用してインテントの遷移としてブラウザを起動します。Intentの第一引数にandroid.intent.action.VIEWを、第二引数にURLを指定することでURLのページを開くインテントを作成出来ます。

onCreateは、ArrayListにListItemを格納する処理を加えて、以下のようになります。

        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                getArticle(createURL());

                ListView list = (ListView) findViewById(R.id.ListView01);
                ArrayList<ListItem> arrayList = new ArrayList<ListItem>();
                for (int i = 0; i < mArticleNum; i++) {
                        arrayList.add(new ListItem(mArticleTitle[i], mArticleURL[i]));
                }
                list.setAdapter(new ListArrayAdapter(this, arrayList));
        }

プログラムを実行すると、ボタンと記事のタイトルが対で表示されます。ボタンをクリックするとブラウザが起動し、記事のURLにアクセス出来ます。


img img

第3回、第4回と2回にかけて通信アプリケーションの開発を行って来ました。
通信プログラムの流れはつかめたでしょうか?今回紹介した内容は他のAPI であっても応用できる内容が多く含まれていたと思います。興味を持った方はぜひ、ご自身で試してみてください。

それではお疲れ様でした!

今回コラムで使用したプログラムはこちらからダウンロード出来ます。


第4回 通信するアプリを作ってみよう(後編)
 Step1 XML解析
 Step2 ListViewによる記事の表示
 Step3 ボタンの配置とブラウザ呼び出し

(文責:株式会社ベストクリエイト)

■免責事項

本コラム内で提供する情報のご利用は、利用者ご自身の責任において行われるものとします。本コラムで提供される各種情報については、慎重に作成、管理をしておりますが、当社は、これらの情報の正確性、有用性、完全性等を保証するものではありません。当社は、利用者がこれらの情報をご利用になったこと、またはご利用になれなかったことにより生じたいかなる損害についても責任を負いません。
本コラムで提供される各種情報に関し、利用者と他の利用者あるいは第三者と紛争が生じた場合、利用者は自己の費用と責任においてこれを解決するものとし、当社に損害を与えないものとします。
当社は、本コラムに掲載する情報の全部又は一部を予告なく変更する場合がございます。また、本コラムの運用を休止または停止する場合がございます。
当社は、理由の如何を問わず本コラムの提供が遅延し、または中断したことに起因して利用者または第三者が被った被害について、一切の責任を負いません。
当社は、利用者が、本コラムで提供している情報からリンクが張られている第三者のウェブサイト、または本サイトへリンクを張っている第三者のウェブサイトから取得された各種情報のご利用によって生じたいかなる損害についても責任を負いません。
通信環境、利用者のコンピューター環境その他の理由により、本コラムが正常にご利用できない場合がございます。
当社は、本コラムから入手された文書・写真・イラスト・動画・リンクその他各種情報(以下総称して「情報」といいます)に関して技術的サポート、機能改善等のいかなる技術的役務の提供もいたしかねますので、あらかじめご了承ください。
本掲載内容・各種名称は公開日時点のものであり、団体・サービス・ツール等の名称が変更されることがあります。

サンプルコード

第1回 リファレンスコード(文字列編)

第2回 リファレンスコード2(グラフィックス編)

第3回 リファレンスコード3(タッチイベント編)

第4回 リファレンスコード4(チェックボックス/ラジオグループ編)

第5回 リファレンスコード5(スピナー編)

第6回 リファレンスコード6(サウンド/ムービー編)

第7回 リファレンスコード7(トースト編)

第8回 リファレンスコード8(Google Maps API利用編)

第9回 リファレンスコード9(SQLite編)

第10回 リファレンスコード10(音声認識編)

第11回 リファレンスコード11(日付/時刻ダイアログ編)

第12回 リファレンスコード12(Bluetooth編)