ページ

2014/12/30

[Android]タブレット対応 〜 Master / Detail パターンを実装する

みなさん、タブレット対応してますか?
僕はまだあんまりなので
とりあえず一番有名な Master / Detail パターンを実装してみることにしました。
Android Studio の Wizard に Master Detail パターンがあるので
コイツを見ておきたいと思います。

ということで Android Studio の Wizard で Master Detail パターンを生成してみると
結構わかりにくいことをしていて、
values-sw600dp/refs.xml で @layout/activity_item_list を参照すると
タブレットでは @layout/activity_item_twopane を参照されるように設定しています。
<item type="layout" name="activity_item_list">@layout/activity_item_twopane</item>
しかも、スマートフォンとタブレットの判別の仕方が微妙で
ItemListActivity.java で setContentView(R.layout.activity_item_list) すると
タブレットでは R.layout.activity_item_twopane が読み込まれて
そのレイアウトの中に R.id.item_detail_container な View があるかで
スマートフォンとタブレットのレイアウトを振り分けています。
setContentView(R.layout.activity_item_list);

if(findViewById(R.id.item_detail_container) != null){
    mTwoPane = true;
}

タブレットかどうかの判定と View の実装は分離しておきたいので
タブレットかどうかのフラグをリソースに定義することにします。
Yukiの枝折: Android:タブレットorスマートフォンのフラグをリソースに定義する
<resources>
    <bool name="isTablet">false</bool>
</resources>
<resources>
    <bool name="isTablet">true</bool>
</resources>

ItemListActivity.java ではこのフラグを参照して処理をわけます。
レイアウトもこのフラグで振り分けます。

public class ItemListActivity extends ActionBarActivity implements ItemListFragment.Callbacks{

    private boolean isTablet;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        isTablet = getResources().getBoolean(R.bool.isTablet);
        setContentView(isTablet ? R.layout.activity_item_twopane : R.layout.activity_item_list);

        if(isTablet){
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setDisplayUseLogoEnabled(false);

            ItemListFragment itemListFragment = (ItemListFragment)getSupportFragmentManager().findFragmentById(R.id.item_list);
            itemListFragment.setActivateOnItemClick(true);
            onItemSelected(0);
        }
    }

    @Override
    public void onItemSelected(int position){
        if(isTablet){
            Bundle arguments = new Bundle();
            arguments.putInt(ItemDetailFragment.ARG_ITEM_ID, position);
            ItemDetailFragment fragment = new ItemDetailFragment();
            fragment.setArguments(arguments);
            getSupportFragmentManager().beginTransaction()
                .replace(R.id.item_detail_container, fragment)
                .commit();
        }else{
            Intent detailIntent = new Intent(this, ItemDetailActivity.class);
            detailIntent.putExtra(ItemDetailFragment.ARG_ITEM_ID, position);
            startActivity(detailIntent);
        }
    }
}
wada811/Android-Material-Design-Colorsサンプルアプリ
Android Studio の Wizard の Master Detail パターンを元に
上記の変更を加えたアプリになっているので参考になるかもしれません。
ソースコードはこちら↓
Android-Material-Design-Colors/sample at master · wada811/Android-Material-Design-Colors