コード側の対応

それでは、コード側(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つで容易に判断できることを理解していただけたと思います。

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

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

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

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

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

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

この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30