寒川アクアブログ

美容師しながらアプリ開発していて水草が趣味の私のブログです

最後にボタンを押してから数秒後に一回だけ処理をする

最後にボタンを押してから数秒後に一回だけ処理をする方法です。

たとえばフローティングアクションボタン(FAB)を設置していて、
ユーザーが何かをしているときはFABは隠しておき、操作が終わった後にちょっと間を置いて再び表示したいときなどに。

private Handler handler;

    //    Handlerのインスタンスをフィールドに宣言

private void doSomethingLater(){

    if (handler != null) {
        handler.removeCallbacksAndMessages(null);

        //    既に予定があればそれはキャンセルする

    }

    handler = new Handler();

    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            Toast.makeText(getApplicationContext(),"HELLO!",Toast.LENGTH_SHORT).show();

        }
    },3000l);    //    処理を予約します
}

doSomethingLater()を呼び出してから3秒後にトーストを表示します。
トーストが出る前に、再度 doSomethingLater() が呼ばれた場合は、
そこから3秒後に初めてトーストを表示します。

画面の向きを取得する

現在の画面の向きを取得する方法です。

Configuration configuration = getResources().getConfiguration();
switch(configuration.orientation) {
    case Configuration.ORIENTATION_PORTRAIT:   

    //    縦向き
       
        break;
    case Configuration.ORIENTATION_LANDSCAPE:

    //    横向き

        break;
}

Configurationクラスのorientationフィールドを調べることで、画面の現在の向きを知ることができます。

テキストサイズをButtonに収まるように調整する

テキストサイズをButtonに収まるように調整するためのメソッドです。
TextViewでテキストサイズを自動調整する方法は検索すると多数出てきます。
こちらを参考にさせていただきました。ありがとうございます。
TextViewのフォントサイズを自動調整する。 - monaka android memo

今回はボタンのように、テキストをあまり変えることがないViewでテキストサイズを調整する場合に便利なメソッドを定義しました。

private float resize(Button button) {

        final float MIN_TEXT_SIZE = 10f;//最小サイズを決める

        String text = button.getText().toString();
        int padding = button.getPaddingLeft();//
        Paint paint = new Paint();

        int viewWidth = button.getWidth() - (padding * 2);//Viewのコンテンツ領域を取得
        int viewHeight = button.getHeight() - (padding * 2);//パディングは左右同じとして
        
        float textSize = 200f;//テキストサイズの初期値を適当に決める

        paint.setTextSize(textSize);//テキストサイズをセット

        Paint.FontMetrics fm = paint.getFontMetrics();
        float textHeight = (Math.abs(fm.top)) + (Math.abs(fm.descent));//テキストの高さを取得

        float textWidth = paint.measureText(text);//テキストの幅を取得

        while (viewWidth < textWidth || viewHeight < textHeight) {//ボタンに収まるまでループ

            if (MIN_TEXT_SIZE >= textSize) {//最小サイズを下回ったら最小サイズに設定
                textSize = MIN_TEXT_SIZE;

                break;
            }

            textSize -= 8f;//テキストサイズをデクリメント(間隔は適当に)

            paint.setTextSize(textSize);

            fm = paint.getFontMetrics();
            textHeight = (Math.abs(fm.top)) + (Math.abs(fm.descent));
            textWidth = paint.measureText(text);//テキストの縦横サイズを再取得
        }

        button.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize);//収まるサイズに設定

        return textSize;

    }

ButtonのプロパティのSingleLineにチェックを入れて下さい。
引数にButtonを渡すと、Buttonのテキストを取得し、サイズを調整します。
調整したサイズをリターンするので、他の同じようなButtonのテキストサイズを調整するには、その値を使えます。
(例:電卓の数字キーなど)
オンクリエイト内等で実行すると、Viewのサイズが0なので文字が小さくなってしまいます。
Viewのサイズと、文字列がわかった時点で実行してください。

ご注意。独自フォントを設定していると、フォントによってはテキストサイズがはみ出してしまったり、
期待通りの結果にならないことがあるようです。
その場合の解決策は、まだ自分で試していないので、確認したら追記します。

EditTextの指定位置にカーソルを移動

EditText備忘録

指定位置にカーソルを移動する

エディットテキストのsetSelection(int型)メソッドの引数にカーソルの位置を指定します。
0で、文字列の先頭になります。

EditText editText;
editText.setSelection(3);
文字列の最後にカーソルを移動する
editText.setSelection(editText.getText().toString().length());

EditText等で、バックスペースの入力を検出する

EditTextの入力中に、ソフトキーボードのバックスペースキーが押されたときのイベントの検出は、以下のようにします。

mEditText.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        if (event.getAction() == KeyEvent.ACTION_DOWN){

            if (keyCode == KeyEvent.KEYCODE_DEL){
                       
            //    バックスペースが押された

            }
        }
        return false;
    }
});

単純に、「押された時」を知るための方法です。
KeyEvent.ACTION_DOWNまたはACTION_UPのどちらかを判別しないと、
タップした時と指を離した時の2回、イベントが呼ばれてしまいます。

EditText等で、Enterキーの入力イベントを検出する

ユーザーがEditTextで文字を入力中に、ソフトキーボードのEnterキーが押されたときのイベントを検出する方法です。

EditTextに以下のようにリスナーをセットします。

mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE){
        
        //    Enterが押されたときに行いたい処理

        }
        return false;
    }
});

ただし、EditTextが複数ある場合だと、Enterを押したときに次のEditTextにフォーカスが移ってしまい、
このイベントが呼ばれません。

ちょっと強引ですが、if分に以下の条件を追加することで、イベントを検出できます。

if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_NEXT){
}

 ソフトキーボードの右下のEnterの位置にあるボタンは、ユーザーの入力の状況によってアクションが「GO」、「次へ」、「検索」のように変化します。
本来ならば、それぞれのアクションに応じた振る舞いを検討するのが良いのかもしれません。

Android実機でデバッグできるようにする

Android実機でデバッグできるようにする方法です。
各メーカーの公式ドライバーをインストールする方法もありますが、
以下の方法を利用するとわずか数分で実機デバッグができるようになります。


端末のほうでは、開発者向けオプションが有効になっているものとします。

実機端末とPCを、データ転送可能なUSBケーブルで接続

PCのデバイスマネージャーをひらく

「ほかのデバイス」のところにある認識されていないアンドロイド実機を右クリックし、
プロパティを開きます。
詳細タブのプロパティからハードウェアIDを選択し

USB\VID_0E8D&PID_201D&REV_????&MI_01
USB\VID_0E8D&PID_201D&MI_01

これらの情報が表示されるウィンドウを開いておきます。


Android SDK をインストールしたディレクトリ内のextras/google/usb_driverにある、android_winusb.infをメモ帳などで開く

SDKのインストール先は、android studioのProject Structureで確認できます。
android_winusb.infが無いときは
AndroidStudioのSDKマネージャーからGoogleUsbDriverをダウンロードします。


[Google.NTx86]と[Google.NTamd64]のところの一番最後に、以下のように記述します

[Google.NTx86]

・・・略・・・

;MIYABI
%SingleAdbInterface% = USB_Install, USB\VID_0E8D&PID_201D&REV_????&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_0E8D&PID_201D&MI_01

[Google.NTamd64]

・・・略・・・

;MIYABI
%SingleAdbInterface% = USB_Install, USB\VID_0E8D&PID_201D&REV_????&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_0E8D&PID_201D&MI_01


端末の名前は、特に決まりはなさそうです。
行はコピー&ペーストして、カンマ(,)以降を、先ほどのハードウェアIDに置き換えます。

メモ帳を閉じて、変更を保存

再びデバイスマネージャーに戻り、先ほどの「不明なデバイス」を右クリックし、「ドライバーソフトウェアの更新」をクリック

「コンピューターを参照してドライバーソフトウェアを検索します」をクリック

android_winusb.infを含むフォルダーを入力し、「次へ」をクリック

途中、警告ダイアログが出ることがありますが、内容に問題がなさそうなら承諾して進めてください。


ドライバーの更新に成功すると、AndroidStudioでの実機デバッグが可能になります。