寒川アクアブログ

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

テキストサイズを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での実機デバッグが可能になります。

Kojittoアプリ プライバシーポリシー

プライバシーポリシー

2016年12月22日 改訂
開発者:Kojitto
mail:kentaro198477@gmail.com

Kojittoの提供するAndroidアプリ「タイマークラシック」、「Digital Timer - free」(以下、当アプリ)では、
ユーザー様の個人情報(年齢・性別・位置情報等)の一切を取得しておりません。
よって、第三者への提供、開示等行われることもありません。
当アプリのダウンロード時に必要となる権限「カメラ機能の利用」については、
当アプリ内でのタイマー終了時におけるユーザー様への通知の手段として、端末のフラッシュライトを点灯させることがあり、
これは端末のカメラ機能の一部を利用することで実現しています。撮影・録画等を行うプログラムは一切含まれておりません。
プライバシーポリシーの変更を行った場合は、当ブログにて通知いたします。

アクティビティをスタックに残さなくする

例えばタイマーアプリを作っていて、

タイマー終了時に透明なアクティビティを開始して、

アラートダイアログを表示し、

OKが押されたり、dismissされたりしたときに

そのアクティビティをフィニッシュするとします。


この透明アクティビティがスタックに残っていると、

端末の”□”をタップしたときに表示され、ユーザーがそれをタップすると

またアラートダイアログが表示されるので、タイマーの挙動としては不自然です。

透明アクティビティがスタックに残らないようにするには、マニフェストに以下のように記述します。

<activity
    android:name=".MyActivity"
    android:excludeFromRecents="true"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
         >

android:excludeFromRecentsをtrueにするだけです。

また、テーマを@android:style/Theme.Translucent.NoTitleBarにした場合、
アラートダイアログのUIデザインが昔っぽいものになってしまうので、
これを避けるには、独自にスタイルを定義する必要があります。