December 5, 2012

NFCでワンタッチ接続できるスピーカー

NFCでワンタッチ接続できるBluetoothスピーカー、ヘッドホン系をまとめてみました。

NFCを搭載しているAndroid端末であればSONY系の端末だけでなく、NFCを使ってワンタッチするだけでBluetoothの接続が完了します。いままでのように初回だけとはいえBluetoothのペアリングがワンタッチするだけで接続できるのは簡単かつ便利です。Bluetooth機器をみんなで使い回したい場合でもちゅうちょしなくなります。

NFC + Bluetoothヘッドホン



NFC + Bluetoothスピーカー



ワンタッチ接続対応するにはアプリをインストールする必要があります。

NFC簡単接続
Sony Corporation


BACKキーで確認画面を表示する

BACKキーを押すと通常はそのActivityを終了して前のActivityに戻るといった動作をしますが、例えば、データ入力をするActivityでBACKキーを押されたとき、ポップアップを表示して入力をキャンセルして本当に前の画面に戻るかどうか促す、というUIにしたいときがあります。こういう処理をしたいときは、BACKキーのイベントをオーバーライドすることで自由に制御を変更して対応することができます。

例:BACKキーをおされたときにポップアップを表示してキャンセルか続行か促す




まずは、バックキーのイベントを取得して、ポップアップダイアログを表示します。ダイアログの結果を受け取って、キャンセルならfinish()でActivityを終了します。そうでなければ何もしません。

    @Override
    public boolean onKeyDown (int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            showAlert(mContext, new OnMyAlert() {
                @Override
                public void onResult(boolean isYes) {
                    if (isYes) {
                        finish();
                    }
                }
            });
        }
        return false;
    }

ポップアップダイアログを表示するメソッドです。Yes/Noの2つのボタンを表示して、結果を返します。

    private void showAlert(Context context, final OnMyAlert onMyAlert) {
        // Build
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(R.string.warning);
        builder.setMessage(R.string.mes_warn_cancel);
        // Left button
        builder.setPositiveButton(R.string.answer_no, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                onMyAlert.onResult(false);
            }
        });
        // Right button
        builder.setNegativeButton(R.string.answer_yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                onMyAlert.onResult(true);
            }
        });
        // Show
        builder.create().show();
    }

結果を渡すためのインターフェースです。

public interface OnMyAlert {
    public abstract void onResult(boolean isYes);
}

December 3, 2012

Intentにオブジェクトを付加して送信する

Intentを送るとき、さまざまな情報(intやStringなど)を付加することができますが、自分で作ったクラスのオブジェクトそのものを付加することもできます。

ただし、どんなクラスでも付加できるわけではなく、条件としてそのクラスがSerializableインターフェースを実装している必要があります。もちろんクラス内部のメンバー変数もすべてSerializableを実装したクラス、またはintなどのプリミティブである必要があります。

Serializableへの対応は特殊な使い方をしない限り、特に必須で実装するものはありません。通常は"implements Serializable"をクラスに追加し、serialVersionUIDを定義するだけです(eclipseで自動生成できます)。このUIDの値も気にする必要はありません。

例:クラスの定義
public class SampleClass implements Serializable {
    private static final long serialVersionUID = 1L;

例:intentを送る
public class SampleClass implements Serializable {
    SampleClass sample = new SampleClass();
    Intent intent = new Intent(getApplicationContext(), MyActivity.class);
    intent.putExtra("Foo", sample);
    startActivity(intent);

例:intentを受ける
    SampleClass sample = (SampleClass) getIntent().getSerializableExtra("Foo");

オブジェクトを送ることができると書きましたが、送り側と受け手側で同じ中身のオブジェクトが受け取れるという意味で、インスタンスは異なります。

参考:Android Developers:Serializable
参考:Android Developers:Intent

CharSequenceとStringの関係

コードの中で文字列の定義は通常Stringを使うと思いますが、UI系のメソッドをみると、文字列の受け取り側は大抵はStringでなくCharSequenceだったりします。が、Stringをそのまま渡すことができるので、その関係を整理してみました。

CharSequenceはインターフェースです。メソッドを見ると文字列を制御するための最小限のみ定義されています。Android Developersで確認すると多くのクラスがこれを実装しているのがわかります。


StringもCharSequenceを実装しているクラスなので、そのまま渡せるというわけです。


参考:Android Developers:CharSequence
参考:Android Developers:String

stringリソースからString文字列を取得する

文字列は通常はstringリソースファイルに記述します。このときリソースidであれば、R.string.XXXで直接取得できますが、文字列を取得する場合は、ContextにあるgetString(int resId)を使って取得します。

例:
getString(R.string.sample)

参考:Android Developers:Content - getString