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

コード側の対応
それでは、コード側(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つで容易に判断できることを理解していただけたと思います。
これまで見てきたように、個々の端末の特徴に合わせて調整したリソースを用意し、適切な修飾子を付ければ、切り替えはリソース・マネージャに任せることができます。
今後、さまざまな端末の登場が予想されますが、恐れることはありません。
開発者として、画面の大きさや操作系に応じて、構成や操作系の向上に注力すればよいのです。
次回は、端末に搭載されているセンサーの有無や、位置情報の取得方法が異なる点を想定したコードの書き方について解説します。
今回よりもさらにコード(プログラム)寄りの話になる予定です。
それでは次回、最終回でお会いしましょう。



