Androidで動く携帯Javaアプリ作成入門
連載インデックスへ
Androidで動く携帯Javaアプリ作成入門(25)

Android Compatibility packageで2.x系でもマルチサイズ対応


株式会社イーフロー
緒方聡
2011/9/15

FragmentActivityを継承

 Compatibility packageを利用してFragmentを利用するActivityは、Compatibility packageで提供されるFragmentActivityを継承しなければなりません。

- PR -

ListFragmentの改善

 前回のサンプルアプリでは、Fragmentの実装方法を説明するために、あえてあまり良くない方法を取りましたが、今回その実装が裏目に出てしまいました。前回のソースコードには、より良い実装方法がコメントアウトされている状態になっているのですが、そのコメントアウトを元に戻す修正が必要です。

 Compatibility packageに付属しているソースコードを見たところ、内部ではListFragmentで使用されるListViewは、「android.R.id.list」パッケージで定義されていることを期待しています。onCreateView()をオーバーライドして独自にViewを作ることは、3.0のFragmentの実装では問題ありませんでしたが、Compatibility packageの実装では想定されていないようです。

 これで、ようやく2.3上でFragmentが動作するようになります。

スマートフォン上でFragmentsが動作している様子

画面の大きさによってレイアウトを使い分けるには

 ここまでは、単にFragmentを2.3で動作するようにしただけですが、Fragmentの本来の目的は画面の大きさの違いを吸収することであり、あと一手間でそれができるため、やってしまいます。

 仕様は、「幅が800ピクセル以上ならタブレットのように分割し、そうでなければスマートフォンのように分割しない」ということにします。

 詳細はソースコードを見てもらうということにし、ここではポイントをかいつまんで説明します。

Display display = wm.getDefaultDisplay();
int width = display.getWidth();
 
if (width < 800) {
    setContentView(R.layout.bookmark);
} else {
    BookmarkFragment.withFragment = true;
    setContentView(R.layout.main);
}

 幅が800未満であるかどうかをActivity内で判定し、適用するレイアウトを選択しています。レイアウトは別途用意する必要がありますが、もともと2つ並んでいたFragmentの1つを削除しただけのレイアウトであることは、見てもらえばすぐに分かります。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Log.d(TAG, "onListItemClick");
    if (withFragment) {
        if (position == 0) {
            getFragmentManager().popBackStack();
        } else {
            String url = BOOKMARKS[position][1];
            WebFragment web = new WebFragment(url);
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment2, web);
            ft.addToBackStack(null);
            ft.commit();
        }
    } else {
        if (position == 0) {
            getActivity().finish();
        } else {
            Intent intent = new Intent(getActivity(), WebActivity.class);
            intent.putExtra("url", BOOKMARKS[position][1]);
            getActivity().startActivity(intent);
        }
    }
}

 リストがクリックされた際に、Fragmentを使用しているかそうでないかによって、Fragmentをリプレイスするか、Intentを発行するか動作を切り分けています。Fragmentを使用しない場合、新たに遷移先のActivityが必要ですが、処理自体はFragment側にあるので、以下のような簡単な実装で済んでしまいます。

package com.example.android.fragment;
 
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.Window;
 
public class WebActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
 
        setContentView(R.layout.web);
        String url = getIntent().getStringExtra("url");
        WebFragment wf = (WebFragment)getSupportFragmentManager().findFragmentById(R.id.fragment2);
        wf.getWebView().loadUrl(url);
    }
}

 こうした対応を行うことで、画面が大きければ画面分割をし、画面が小さければ今までどおりの画面遷移を提供するアプリが、2.3でもできるようになります。

画面が大きければ画面分割

画面が小さければ画面遷移

需要の多い2.x系に欠かせないCompatibility package

 現在はAndroid 2.x系とAndroid 3.x系が同時進行している状態ですが、どちらが古い、どちらが新しいということではなく、それぞれスマートフォン向け、タブレット向けのエディションであると考えてもらえればよいと思います。

 また、Androidのデバイスは多様化しており、電子書籍リーダー、メディアプレイヤー、フォトフレームなど、タブレットとスマートフォンの間の画面サイズを持つ製品がすでに登場しています。それらのAndroidのバージョンは、ソースコードが公開されていないなどの問題から、3.xではなく2.xが採用されていることが多く見られます。

 そうしたデバイスで快適な操作性を提供したいと考えるなら、Compatibility packageを適用しない手はないでしょう。

@IT関連記事


Android開発で泣かないための「テスト」の重要性
第1回Androidテスト祭りレポート その自由度の高さや多様性ゆえに、さまざまな課題を抱える、Androidアプリ開発の“テスト”に焦点を当てたイベントの模様を紹介します
Smart & Social」フォーラム 2011/9/5
はじめまして。Androidアプリ開発&デザイン
@ITスマソ開設記念! 女子部部長に聞くAndroid
年末も大注目のAndroidのアプリについて。制作のコツ、注意点、アイデア、ソーシャルサービスの生かし方などを探った
Smart & Social」フォーラム 2010/12/7
スマートフォンアプリデザインに役立つ基礎のまとめ!
一撃デザインの種明かし(14) iPhone/AndroidアプリのUIデザインに困っている方のために、アプリの事例や、作るときのコツ、画面サイズのデータ、参考リンクなどを紹介
売れるスマホアプリを目指せ! テスト達人への道
安藤幸央のランダウン(56)
 iPhone/iPad・Androidアプリ開発にが重要な“使い心地”。しっかりとしたテストを経た高品質なアプリを作るためのポイントをまとめて紹介しよう
Java Solution」フォーラム 2011/4/27
今日から始める! Androidケータイアプリ作成の基礎
いまこそ知っておきたい「Androidアプリ」とは 日に日に国内でのニュースが増えているAndroidケータイ。その特徴を押さえてアプリ作成を始めるための基礎を紹介します
Smart & Social」フォーラム 2009/11/19
/fjava/index/index_eclipsejava.html 【改訂版】Eclipseではじめるプログラミング New!
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
Java Solution」フォーラム

ケータイ分野以外の組み込みデバイス開発の現場でも注目を集めている「Android」。組み込みデバイスへの適用からアプリケーション開発、イベントレポート、ニュースなどAndroidに関するさまざまな技術情報・最新動向をお届けします!

1-2
 

 Index
第25回 Android Compatibility packageで2.x系でもマルチサイズ対応
  Page1
便利なFragmentsをAndroid 2.x系でも
「Compatibility package」の導入方法
「Compatibility package」の使用方法
  Page2
画面の大きさによってレイアウトを使い分けるには
需要の多い2.x系に欠かせないCompatibility package

Androidで動く携帯Javaアプリ作成入門 バックナンバー 連載インデックスへ»


ご意見、ご感想は Smart&Social 会議室へどうぞ


 Smart&Social フォーラム トップページへ


TechTargetジャパン

Smart & Social フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH