Android開発
EditTextの入力制御
Google Mapsを利用したアプリ開発 (開発準備)
【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に呼称が変更 |
最近のコメント