さまざまなリソース切り替え設定

2010年5月20日(木)
有山 圭二(ありやま けいじ)

コード側の対応

それでは、コード側(MainActivity)を見ていきましょう。

端末にトラックボールがある場合、ユーザーがトラックボールを操作するとonTrackballEventが呼ばれるので、通常は onTrackballEventをオーバーライドすることでイベントを処理します。

コードでは、トラックボールが押された場合にshowToastメソッドを実行しています(44行目)。showToastメソッドは、画面に execute(または実行)と表示します(59行目)。

	<code>
public class MainActivity extends Activity {
    /*
     * (non-Javadoc)
     * @see android.app.Activity#onTrackballEvent(android.view.MotionEvent)
     */
    @Override
    public boolean onTrackballEvent(MotionEvent event) {

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 画面に実行(execute)と表示する
            showToast();
            break;
        }
        return super.onTrackballEvent(event);
    }

    /**
     * 画面に実行(execute)と表示する
     */
    private void showToast() {
        Toast.makeText(this, R.string.execute, Toast.LENGTH_LONG).show();
    }
}
</code>




トラックボールが無い場合は当然、onTrackballEventが呼ばれることはありません。その代わり、nonav修飾子のついたリソースが選択されるので、画面にボタンを表示します。

繰り返しますが、今回の対応では、このボタンを押すことで、トラックボールが押された場合と同じ挙動(showToastの呼び出し)を予定しています。

ボタンが押されたときの処理は、サンプル・プロジェクト「MainActivity」の23行目から36行目で指定しています。現在はコメント・アウトされているので、コメントを外して有効にしてください。

ボタンが押されたときの処理の定義は、2段階で行います。

最初に、表示されたボタンのオブジェクトを取得して、次に、取得したオブジェクトがクリックされた時に実行されるリスナー「OnClickListener」を設定します。

コードでは、ボタン・オブジェクトの取得はfindViewByIdで行っています(25行目)。次に、取得したオブジェクトに OnClickListenerを設定しています(29行目から34行目)。

	<code>
public class MainActivity extends Activity {

    View mBtnExecute = null;

    /*
     * (non-Javadoc)
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 表示中のレイアウトから、ボタンIDと一致するオブジェクトを取得
        mBtnExecute = findViewById(R.id.btn_execute);

        // nullであれば、ボタンが存在しない
        if(mBtnExecute != null) {
            mBtnExecute.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    // 画面に実行(execute)と表示する
                    showToast();
                }
            });
        }
    }
}
</code>




そして、OnClickListenerでは、showToast()メソッドを実行しています(32行目)。

ボタン・オブジェクトを取得した直後のif文に注目してください(28行目)。ここでオブジェクトがnullでないかを判定しています。

これは、findViewByIdでオブジェクトを取得する際に、表示した画面中に指定したIDに対応するオブジェクトがなかった場合はnullを返すためです。

従って、トラックボールに対応した端末でbtn_executeのIDを持ったオブジェクトが存在しない場合は、戻り値がnullとなるためif文内は実行されず、OnClickListenerは設定されません。

このようにして、複数のレイアウト・リソースが切り替わる場合でも、表示しているレイアウトに含まれる画面の部品の有無に応じて、柔軟にコードを書くことができます。

まとめ

いかがでしたか。

今回は、ユーザー環境に応じた言語の設定と、トラックボールが無い端末で画面の操作系を変える方法について解説しました。

3回目にしてようやくコードを触りましたが、環境に応じて画面を構成する部品が増えたり減ったりしても、if文1つで容易に判断できることを理解していただけたと思います。

これまで見てきたように、個々の端末の特徴に合わせて調整したリソースを用意し、適切な修飾子を付ければ、切り替えはリソース・マネージャに任せることができます。

今後、さまざまな端末の登場が予想されますが、恐れることはありません。

開発者として、画面の大きさや操作系に応じて、構成や操作系の向上に注力すればよいのです。

次回は、端末に搭載されているセンサーの有無や、位置情報の取得方法が異なる点を想定したコードの書き方について解説します。

今回よりもさらにコード(プログラム)寄りの話になる予定です。

それでは次回、最終回でお会いしましょう。

著者
有山 圭二(ありやま けいじ)

有限会社シーリス代表。日本Androidの会 運営委員。手間暇かけてくだらないことをするのが大好きで、2007年11月にAndroidの発表を知り「All applications are created equal」の言葉に惹かれて参入。代表的な開発アプリは「MoreLocale 2」、「近藤昭雄シリーズ(憂鬱・退屈)」、「薬検索」など。twitter ID: keiji_ariyama

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています