Android開発基礎

特に考慮せず、Activityのレイアウトを作成するとAndroidは自動認識で一番初めのEditTextにカーソルをあてる動作をします。この機能は非常に便利ではありますが、時と場合によっては避けたいケースがあります。そんな時の対処法の紹介です。

左図のように画面起動時にAndroidの初期動作として画面一番初めのEditTextにカーソルがあたってしまう。どうにかしてカーソルがあたらない状態で画面を起動したい。

EditTextにカーソルやフォーカスを適用させない方法は非常に簡単でxmlファイルの記述だけで済みます。以下のようにandroid:cursorVisibleとandroid:focusableInTouchModeを「false」にすることで
Androidの自動認識でEditTextにカーソルやフォーカスがあたることを防ぐことができます。

しかし、ここで大きな問題点があります。

xmlファイルで上記設定をしてしまうと該当EditTextには二度とカーソルやフォーカスが適用できなくなってしまいます。カーソルやフォーカスが適用されないことを仕様とする場合は上記設定だけでいいわけですが、そうでない場合は困ります。

自動認識のカーソルやフォーカス適用だけ防ぎ、任意で適用させる為にはActivity側のjavaコードで対応することができます。簡単に言うと、EditTextのタッチイベントでフォーカスを有効にしてあげればいいわけですね。

こんな感じで記述します。

edt1 = (EditText)findViewById(R.id.edt1);

edt1.setOnClickListener(new OnClickListener() {
      @OverRide
      public void onClick(View v) {
           v.setFocusable(true);
           v.setFocusableInTouchMode(true);
           v.requestFocus();
    
           InputMethodManager  im = 
                  (InputMethodManager)setSystemService(Context.INPUT_METHOD_SERVICE);
           if (null != im) {
                   im.showSoftInput(v,0);
           }
     }
});

InputMethodManagerの記述は入力用キーボードを表示させる為に必要なコードです。

以上で画面起動時のカーソルやフォーカスの適用を防ぐ方法、および必要な時にカーソル、フォーカスを適用させる方法の解説となります。

EditTextに自動でカーソルをあてたくない場合の対処法

特に考慮せず、Activityのレイアウトを作成するとAndroidは自動認識で一番初めのEditTextにカーソルをあてる動作をします。この機能は非常に便利ではありますが、時と場合によっては避けたいケースがあります。そんな時の対処法の紹介です。

左図のように画面起動時にAndroidの初期動作として画面一番初めのEditTextにカーソルがあたってしまう。どうにかしてカーソルがあたらない状態で画面を起動したい。

EditTextにカーソルやフォーカスを適用させない方法は非常に簡単でxmlファイルの記述だけで済みます。以下のようにandroid:cursorVisibleとandroid:focusableInTouchModeを「false」にすることで
Androidの自動認識でEditTextにカーソルやフォーカスがあたることを防ぐことができます。

しかし、ここで大きな問題点があります。

xmlファイルで上記設定をしてしまうと該当EditTextには二度とカーソルやフォーカスが適用できなくなってしまいます。カーソルやフォーカスが適用されないことを仕様とする場合は上記設定だけでいいわけですが、そうでない場合は困ります。

自動認識のカーソルやフォーカス適用だけ防ぎ、任意で適用させる為にはActivity側のjavaコードで対応することができます。簡単に言うと、EditTextのタッチイベントでフォーカスを有効にしてあげればいいわけですね。

こんな感じで記述します。

edt1 = (EditText)findViewById(R.id.edt1);

edt1.setOnClickListener(new OnClickListener() {
      @OverRide
      public void onClick(View v) {
           v.setFocusable(true);
           v.setFocusableInTouchMode(true);
           v.requestFocus();
    
           InputMethodManager  im = 
                  (InputMethodManager)setSystemService(Context.INPUT_METHOD_SERVICE);
           if (null != im) {
                   im.showSoftInput(v,0);
           }
     }
});

InputMethodManagerの記述は入力用キーボードを表示させる為に必要なコードです。

以上で画面起動時のカーソルやフォーカスの適用を防ぐ方法、および必要な時にカーソル、フォーカスを適用させる方法の解説となります。

EditTextの入力制御

EditTextを数値のみ許可する

EditTextで数値のみに対応したいケースがよくありますよね。
そんな時の対応方法です。(キーボード入力も数値のみの対応)

基本的にアクティビティデザインのxmlファイル内の記述ですべて対応が可能です。

<EditText
android:id="@+id/startCnt"
android:layout_width="wrap_content""
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:digits="01234567890"
android:gravity="right"
android:inputType="number"
android:maxLength="5"
android:text="0" />

■EditTextに数値のみ入力を可能にしたい制御は以下の記述で対応が可能です。

android:digits=”01234567890″

■キーボード入力で数値のみ対応した場合は以下の記述が必要になります。

android:inputType=”number”

■EditTextへの入力桁数の制御も以下の記述で対応可能になります。

android:maxLength=”5″   ※この場合は5桁対応。

今回は数値のみの入力制御対応でしたが、inputTypeを利用することによりいろんなタイプの入力制御を行うことが可能です。以下に一覧をまとめておきますの参考にどうぞ。

inputType 内容説明
text テキスト入力
textCapCharacters 大文字入力
textCapWords 先頭文字を大文字にする場合
textCapSentences 文章の先頭を大文字にする場合
textAutoCorrect 文字入力を自動修正させる場合
textAutoComplete 文字の補完入力に対応させる場合
textMultiLine 複数行入力させる場合
textUri URLを入力させるさせる場合
textEmailAddress メールアドレスを入力させる場合
textEmailSubject メール件名を入力させる場合
textShortMessage ショートメッセージを入力させる場合
textLongMessage ロングメッセージを入力させる場合
textPersonName 人名を入力させる場合
textPostalAddress 住所を入力させる場合
textPassword パスワードを入力させる場合
textVisiblePassword パスワード入力を表示させて入力する場合
textWebEditText THMLを入力させる場合
textFilter 他のデータでフィルタされた文字を入力する場合
textPhonetic 発音記号を入力させる場合
numberSigned 符号付きの数値を入力させる場合
numberDecimal 少数入力をさせる場合
phone 電話番号を入力させる場合
datetime 日時を入力させる場合
date 日付を入力させる場合
time 時刻を入力させる場合

【Android開発基礎】 端末回転時の画像内容を保存する

Android端末では画面を回転させると画面リサイズとともに表示されていた内容が初期化されてしまう望ましくない内部事情があります。
初期化されてしまえば、それまで入力していた大事なデータが消えてしまうわけなので、アプリを利用するユーザーにとっては非常に好ましくない事情となり、クレームにもつながります。
画面回転自体をNGにしてしまえば特に気にすることはありませんが、そうでない場合には、不測の事態にそなえてかならず以下の対応策を施すようにしておくことが通例です。

【画面回転時における初期化を防ぐ方法】

以下の2つのメソッドを記述していくことで回避することができます。
※メソッド内の保存情報、復元情報は製作アプリの情報と置き換えてください。

onSaveInstanceState

onRestoreInstanceState



具体的な記述内容としては以下を参考にしてください。

onSaveInstanceState

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    TextView txtBackUp = (TextView)findViewById(R.id.txtTmp);
    outState.putString("txtBackUp",txtBackUp.getText().toString());
}

onRestoreInstanceState

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    TextView txtRestore = (TextView)findViewById(R.id.txtTmp);
    txtRestore.setText(savedInstanceState.getString("txtBackUp"));
}

【Android開発基礎】ボタンクリック イベントリスナー

Android開発でよく使用する機能のとして、イベントリスナーというものがあります。
例えば、ボタンをクリックした時にある処理を実行するなど、なんらかのイベントが発生した時にだけ呼び出されるメソッドが用意されたイベント専用のクラスがイベントリスナーです。
このイベントリスナーについて簡単な例をもとに見ていきましょう。

以下のようなちょっとしたデザインを作ってみます。
処理内容をボタンクリック時にウィジェットTextViewに何かしらの文字を入力するといったものにします。
ボタンID:btnTmp
TextViewID:txtTmp

Javaコードで以下のようにコードを記述。

1.ボタンのインスタンスを作成
Button btn = (Button)findViewById(R.id.btnTmp);

2.ボタンにイベントリスナーを登録
btn.setOnClickListener(
・・・
・・・
);

3.実装クラスを用意
new View.OnClickListener() {
・・・
}

実行結果は以下のようになります。

 

Activityの状態遷移とライフサイクルイベント

Activityの概念はだいたい以下の図の動きになります。

外部操作によってアプリが起動され、アプリ自身の実行状態が生まれます。
ここから他アプリに遷移した場合、実行状態は一時停止状態に切り替わり停止状態へと
状態変化が行われていきます。
また、遷移先の他アプリが終了となれば、再び実行状態に戻り、自身の終了命令によって
一時停止状態→停止状態と順に状態が変わっていき最終的に消滅状態へと移っていきます。

これが基本的なActivityの状態遷移となります。

また、不測の事態に陥った場合にはAndroid OSによって強制終了となる場合もあります。

Activityのライフサイクルイベント

上記図のActivity全体遷移図が頭の中で描ければ、実際にどういったイベント処理で状態遷移が
行われていくのかを考える必要があります。

実際にこの全体の状態遷移を実行するイベントが以下のものになります。
(細かい内容はここでは割愛します)

「Create」処理、「Start」処理、「Resume」処理、「Pause」処理
「Stop」処理、「Restart」処理、「Destroy」処理

上記のような処理を経て「実行」「一時停止」「停止」「消滅」などの状態遷移が行われますので、アプリの作り手としては状態の遷移を考慮して必要な処理をどうしたいか、その内容を各イベント内に記述して実装していけばいいだけですね。

これがActivityのライフサイクルです。

 

【Android開発】アプリのタイトルバーを非表示にする方法

デフォルトでアプリの新規プロジェクトを作成すると下図のようにActivityに赤枠のようにアプリのタイトルが表示されます。
こういったタイトル領域を削ってアプリ画面の領域リソースをフルに使った画面設計を計画する場合、AndroidManifest.xmlの記述修正で対応が可能になります。

アプリのタイトルバーを消す方法

AndroidManifest.xml内で以下の記述箇所があれば、その記述箇所を修正します。
記述箇所がない場合は、修正内容を追記してAndroidManifest.xmlファイルを保存することで対応ができます。

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

android:theme=”@style/AppTheme”をandroid:theme=”@android:style/Theme.Black.NoTitleBar.Fullscreen”に変更する

たったこれだけの修正で実行アプリの画面からタイトルが消えます。
是非、試してみてください。



上記、修正でもタイトルバーが消えない場合、メインアクティビティーのxmlファイルを確認してみてください。

以下のようなツールバーレイアウトに関する記述があればこれをまるっと削除します。
これで完全にタイトルを消すことができます。

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

【Android開発】レイアウトクラス

レイアウトクラスはフレーム枠の画面位置や大きさ、およびウィジェットクラスの配置を決定するもので、レイアウトクラス同士は入れ子状態になっても問題はありません。
機能面ではViewGroupクラス/Viewクラスを継承するのでこの両クラスのメソッドを使用することができます。
TableLayoutクラスはLinearLayoutクラスを経由してViewGroupクラス/Viewクラスを継承し、ScrollViewクラスはFrameLayoutクラスを経由してViewGroupクラス/Viewクラスを継承します。
AbsoluteLayoutクラスはSDK1.5以降非推奨になっている為、ここでは割愛をしています。

LinearLayoutクラス

LinearLayoutクラスはUIオブジェクトを縦方向または横方向に順番に並べていきます。
LinearLayoutクラスの実装メソッドはsetOrientationメソッド/setGravityメソッドの2つだけです。

    • setOrientationメソッド

子の配置を設定します。
メソッドの引数、またレイアウトXML上での属性値は以下の表のようになります。

メソッド引数 属性値 概要
setOrientation.VERTICAL vertical 縦方向への配置
setOrientation.HORIZONTAL horizontal 横方向への配置
    • setGravityメソッド

子の配置位置やサイズ変更を設定します。
レイアウトエリアの横位置を左寄せ・中央揃え・右寄せ、縦位置を上揃え・中央揃え・下揃えを指定します。またサイズ変更は、幅や高さをレイアウト枠いっぱいに広げるかどうかの設定を行います。

レイアウト設定の一例を下図に掲載。

TableLayoutクラス

TableLayoutクラスは、UIオブジェクトをテーブルのマス目に配置します。
また、TableLayoutは行数のTableRowだけを集約し、列数の集約はTableRowが行います。

TableLayoutのメソッド/属性と概要

メソッド 属性値 概要
setColumnCollapsed android:collapseColumns 折り畳み
setColumnShrinkable android:shrinkColumns 幅縮小可の指定
setColumnStretchable android:stretchColumns 幅拡張可の指定

TableRowの属性と概要

属性 概要
android:layout_column 配置する列番号の指定
android:layout_span 占有する列数の指定

FrameLayoutクラス

FrameLayoutクラスは、1つだけのUIオブジェクトを格納するためのレイアウトクラスです。
1つのオブジェクトを他のオブジェクトとから独立させたい場合に使用します。

FrameLayoutクラスのメソッドと属性

メソッド 属性 概要
setForeground android:foreground 前景の設定
setForegroundGravity android:foregroundGravity 前景オブジェクトの配置方法

setForeground

前景設定となる為、追加するオブジェクトが背景よりもサイズが大きい場合FrameLayoutは前景だけの表示となります。
これは追加オブジェクトに対してオーバーレイした形で表示されることを意味しています。

setforegroundGravity

前景となるオブジェクトの配置方法を指定するメソッドです。
属性値は、以下の表の通りGravityの属性値と同じです。

setforegroundGravity属性値

配置パターン 属性値 概要
横方向の位置 left 左寄せ
right 右寄せ
center_horizontal 中央寄せ
縦方向の位置 top 上寄せ
bottom 下寄せ
center_vertical 中央寄せ
縦横一括 center 縦横中央寄せ
横幅合わせ fill_horizontal オブジェクトの幅をエリアいっぱいに合わせる
高さ合わせ fill_vertical オブジェクトの高さをエリアいっぱいに合わせる
縦横一括合わせ fill 横幅・高さをエリアいっぱいに合わせる

ScrollViewクラス/HorizontalScrollViewクラス

Android端末の縦幅・横幅を超えたレイアウトを実装したい場合に縦方向へのスクロール対応、横方向へのスクロール対応を行うことができます。
スクロール対応を行わず、実機の画面サイズを超過したレイアウトを設計した場合、画面からはみ出る部分での操作は不可能です。
また、スクロールさせたいエリアも自由に設定することができ、目的に応じてスクロールさせたいオブジェクトエリアの1つ上の階層にScrollViewタグを設定させてあげます。

ScrollViewタグ

縦方向へのスクロールを可能とする

HorizontalScrollViewタグ

横方向へのスクロールを可能とする

【Android開発】Viewクラス/ViewGroupクラス

Viewクラス

ViewクラスはすべてのUIクラスのベースとなるクラスです。
Viewクラスが提供するメソッドはUIクラスに共通するもので、JavaコードやLayoutリソースの中で使用されます。

Viewクラスのメソッドと概要一覧

メソッド 概要
setBackgroundColor 背景色の設定
setBackgroundResource Colorリソース指定による背景色設定
setId ID設定
getId ID取得
setTag タグ設定
getTag タグ取得
setOnClickListener クリックイベントメソッド登録
setClickable クリック可設定
setPadding 余白設定
setLayoutParams 幅、高さ設定
setVisibility 表示/非表示設定



ViewGroupクラス

ViewGroupクラスは、レイアウトやウィジェットを親子の関係に構造化するクラスです。主な機能としては、レイアウトやウィジェットを子として追加する機能や子とする際の位置決めを行う機能を実装しています。レイアウトクラスはこのViewGroupクラスを継承することでコンテナとしての機能をもつことができます。

Viewクラスのメソッドと概要一覧

メソッド 概要
setClipChildren 子の描画範囲設定
setClipToPadding Paddingを含む子の描画範囲設定
addView(View) 子の追加
addView(View,ViewGroup.LayOutParams) 子の追加(パラメータ付)
removeView 子の削除

setClipChildren

子の描画範囲の制限を設定するメソッド
引数にTrueをセットすることで親の枠内を超えた位置に子を配置することができないよう制限

setClipPadding

引数にTrueをセットすることで親のパディング内の位置に子を配置することができないよう制限

addView

子のUIオブジェクトを親に追加

removeView

子のUIオブジェクトを親から削除

【Android開発】XMLファイルで使用する単位についてのまとめ

Android開発のレイアウト設定では決まった単位を使用することになっています。
そこでAndroid開発で使用できる単位についてのまとめておきます。

 

単位 正式名称 概要
px pixels ピクセルをそのまま使用した単位
pt points 1/72インチを1にした単位
mm millimeters ミリメートル
in inches インチ
dp(dip) Density Independent Pixels 解像度に依存しない仮想的pixel
sp Scale Independent Pixels 指定フォントサイズに依存する仮想的pixel単位



上記単位を使用して表示するウィジェットの幅や高さを指定することができますが、
Androidでは以下の定数を使って表示領域を指定することが多いので合わせてまとめておきます。

定数 概要
fill_parent 親の幅や高さいっぱいにウィジェットを表示する
wrap_parent 表示する内容を包括するレベルで幅や高さを決定する
match_parent fill_parentと同様。API8以降にfill_parentからmatch_parentに呼称が変更