SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Web APIで楽々Androidアプリ

Androidアプリでの、スマホとタブレットのレイアウト自動切り替え

Web APIで楽々Androidアプリ(9)

レイアウトの修正

 1ペインのレイアウトは、次の図のように、地図画面の上に最寄り駅一覧のfragmentが重なるようにFrameLayoutを利用して定義しておきます。

1ペインのレイアウト
1ペインのレイアウト
onepane.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <fragment
        android:id="@+id/map"
        android:name="com.rakuraku.android.ekimap.MyMapFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    <fragment
        android:id="@+id/eki_list"
        android:name="com.rakuraku.android.ekimap.EkiListFragment"
        android:layout_height="fill_parent"
        android:layout_width="200dp"
        android:orientation="horizontal" />
</FrameLayout >

Activityの修正

 最後に、MainActivityとEkiListFragmentの修正です。主にMainActivityへの追加、変更です。

MainActivity.javaの変更部分
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}

// ListFragmentの表示・非表示、ナビゲーションアイコンの表示を切り替える(1)
public void toggleList(boolean hide) {
    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction(); //(2)
    ListFragment listFragment =
                        (ListFragment)fm.findFragmentById(R.id.eki_list); //(3)

    // 引数のhideがtrueまたはListFragmentが表示されているとき
    if (hide==true || listFragment.isVisible()) {
        // ListFragmentを非表示にする
        transaction.hide(listFragment);
        // ナビゲーションアイコンを表示する(4)
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }
    else {
        // ListFragmentを表示する
        transaction.show(listFragment);
        // ナビゲーションアイコンを非表示にする
        getActionBar().setDisplayHomeAsUpEnabled(false);
    }
    // Fragmentへの操作を確定する
    transaction.commit(); //(5)
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    // 1ペインなら
    if (getResources().getBoolean(R.bool.is_one_pane)) {
        // アクションバーのアイコンがクリックされたとき(6)
        if (android.R.id.home == item.getItemId()) {
            toggleList(false);
        }
    }
    return super.onMenuItemSelected(featureId, item);
}

@Override
protected void onResume() { //(7)
    super.onResume();
    // 1ペインならListFragmentを非表示、2ペインなら表示する
    toggleList(getResources().getBoolean(R.bool.is_one_pane));
}

 toggleListというメソッド(1)では、1ペインの場合に、地図にオーバーラップしてListFragmentを表示したり、ナビゲーションアイコンの表示を切り替える処理を定義しています。

 ListFragmentの表示/非表示や、追加/削除などの操作は、FragmentTransactionというクラスを利用して行います(2)。Fragmentは、findFragmentByIdメソッドなどでインスタンスを取得し、それを通じて操作します。なお、Fragmentに行った変更は、最後にcommitメソッドを呼び出して確定させる必要があります(5)

 (4)のナビゲーションアイコンとは、アプリケーションバーに表示されるアプリアイコンの左横に表示されるアイコンのことです。これは、メニューなどを呼び出すためのアイコンで、Gmailアプリなどでおなじみでしょう。

 このアイコンの表示は、ActionBarクラスのsetDisplayHomeAsUpEnabledメソッドで行います(4)。また、このアイコンをタッチすると、onOptionsItemSelectedメソッドがコールバックされます。その際、MenuItemパラメーターのIdが、android.R.id.homeという値になります(6)

 Activityが実行中になる直前にコールバックされるonResumeメソッドでも、toggleListメソッドを実行していますが(7)、これは1ペインでの初期表示ではListFragmentを非表示、2ペインの初期表示なら表示するようにするためです。

EkiListFragment.javaの変更部分
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ListView list = getListView();
    // 背景を白にする(8)
    list.setBackgroundColor(Color.WHITE);
}

 EkiListFragmentの変更は、リストの背景を白にするものです(8)。この設定がないと、透明の背景になり、単に文字だけの表示になってしまいます。

最後に

 今回は、Web APIからは離れてしまいましたが、1ペインと2ペインの自動レイアウト切り替えと、地図表示の上に最寄り駅の一覧をオーバーラップさせるスマートフォン用の画面を解説しました。

 次回は、Twitterと連携するためのAPIを紹介する予定です。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Web APIで楽々Androidアプリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7658 2014/03/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー