【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のライフサイクルです。

 

【Xeory Base カスタマイズ】サイドウィジェットのタイトル装飾

テーマに対してちょっとしたカスタマイズを加えるだけでガラッと見栄えが変化したりしますよね。
これからXeroy Baseのテーマに対してカスタマイズを少しずつ加えていくことにしましたので、その辺を紹介していければなと思っています。

まず手始めに何をしようかと考えたところ、サイドページ(ウィジェット)があまりにも殺風景だったので、各サイドウィジェットのタイトルに装飾を加えることにしました。
カスタマイズ内容として非常に単純でCSSに以下赤字箇所を追加することで対応が可能です。

カスタマイズ内容

① タイトルバーのバックグラウンドカラーを設定
② タイトルバーに影を設定して立体化
③ タイトルの印字位置を中央揃えに変更
④ 上下にpadding設定

.side-widget .side-title {
margin: 0 0 32px;
font-size: 15px;
text-align:center;
background-color:#4169e1;
color:white;
padding:3px 0 3px 0;
box-shadow:5px 5px rgba(0,0,0,0.4);

}

③のタイトル印字位置の変更ですが、もともと左揃えがデフォルトであり、リストタイトルの左揃えと同化している感じで気持ち悪かったのでウィジェット別の区切りをはっきりさせようかと思いタイトルの印字位置を中央揃えに変更しました。
また、②のShadow設定と合わせて、よりタイトルの強調化をはかっています。

変更前の画像

変更後の画像

 

ちょっとした変更ですが、サイドウィジェットのタイトルをはっきりさせるだけでもサイトの全体像が少し引き締まった感じがでますね。

【Android Studio】AVD(Android Virtual Device)が起動しない場合の対処法

Android Studioをインストールした時によく直面する問題ですね。
実機では動作確認できるけれどもエミュレーターを使おうとすると動かないといったケースに
遭遇する方は意外に多いのではないでしょうか。

このAVDが動かない原因と対処法を以下にまとめますのでご参考までにどうぞ。

エミュレーターが起動しない原因は大きくわけて2つあります。

エミュレーターが起動しない原因

  1. 開発環境PCのBIOS設定で仮想化支援機能が無効になっている
  2. Intel x86 Emulator Accellerator(HAXM)がインストールされていない

だいたいこの2つの問題を解決するだけでエミュレーターを無事に起動することができると思います。

問題の解決方法

1.開発環境PCのBIOS設定で仮想化支援機能を有効にする

※解決方法の解説の前に使用されている開発環境PCが仮想化支援機能を有していな場合は、エミュレーターでの実行は無理ですのでその点ご注意ください。

BIOS設定はPC起動時に行います。どのPCでも入口は同じです。
ただし、PCによってBIOS設定画面起動のキーが異なるのであらかじめ確認をしておいてください。
PCの取説などがない場合は、PCに電源を入れた際にチラッと表示される画面にBIOS起動キーが表示されています。
ほどんどがファンクションキーまわりの(ESC、F1、F2、F12)ではないでしょうか?

無事にBIOS設定画面を起動できたら、まずはCPU関連の設定項目を探してみてください。
※仮想化支援機能はCPU設定項目です。

BIOS設定画面もまたメーカーによってレイアウト、扱う言葉などがまったく異なりますのでCPU設定項目の中で「Virtual」「Virtualization」「VT」などの単語が表示されている項目があれば間違いありません。
その設定項目の設定値が「FALUSE」または「DISABLE」とかになっていた場合はエミュレーターなどの仮想化技術が使用できない状態になっていますので、この設定を「TRUE」または「ENABLE」に変更してあげます。
すでに「TRUE」もしくは「ENABLE」になっている場合は変更する必要はありません。

BIOSの設定は以上となります。

2.HAXMをインストールする

2-1.SDKのインストール

エミュレーターを実装する上でSDKが絶対条件として必要になります。
ただ、Android Studioにはあらかじめインストールする際にSDKも一緒にインストールされるのでこの点に関してはまず問題ありません。

2-2.エミュレーターを使う上での必須パッケージをインストール

Android SDK Platform-toolsのインストールAndroid Studioから[ツール(T)] – [Android] – [SDKマネージャー]を選択してSDKマネージャーを起動します。

「SDKツール」タブがあるのでこれをクリックしてSDKツール画面を開き、Android SDK Platform-toolsのインストール状況を確認してください。
これがチェックのついていない[未インストール]状態の場合は、インストールを行ってください。
また、あわせてAndroid Emulator、Android SDK Toolsのインストール状況、更新状況も確認してインストールもしくは最新の更新を行ってください。
この設定を行うことでAndroid Studioからエミュレーターを起動させる土台が出来上がりました。

2-3.HAXMのインストール

最後にHAXMのインストールです。
これは開発アプリをどのAndroid OSバージョンを対象にするのかにもよってOSのバージョンごとにインストールをする必要があります。先に[SDKプラットフォーム]で対象とするAndroid OSのバージョン(APIレベル)のパッケージをインストールしておきます。
※パッケージのインストール項目は、「SDK Platform」「System Image」と書かれている項目だけで問題ありません。SDKプラットフォームのインストールが無事に終わると先ほどの[SDKツール]画面に「Intel x86 Emulator Accelerator(HAXM installer)」が現れますのでチェックを入れてインストールを行えば完了です。以上の設定でAVDマネージャーからSDKプラットフォームやSDKツールでインストールを行ったAndroid OSバージョン(APIレベル)の仮想デバイスを作成することでAndroid Studioからエミュレーターを起動することができます。

【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 開発】Default Activity Not Found エラー解消方法

「Default Activity Not Found」エラーの解消方法の紹介

直訳すると基本アクティビティがないよ!とそのまんまです。
他リソースからソースをコピーしてきた、または謝ってアクティビティを消してしまった、キャッシュにゴミがたまっているなど原因はそれぞれあると思いますが、まずはエラーを出力しているであろうAndroidManifest.xmlの中味を確認してみてください。

参考AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sample.sp" android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

赤字内の基本Activity情報がなくなってしまっているか、記述が間違っている可能性がある為、AndroidManifest.xml内の記述と実Activityの存在確認をしてみてください。
大半が、このあたりの整合性が保てていないことが原因で本件のエラーが出ています。

AndroidManifetst.xml内の記述と実Activityの存在の整合性が保てている場合、それでもエラーが出る場合は一度Android Studioをリブートしてみることを勧めます。
リブートしても問題が解決しない場合は、Android Studioのキャッシュにゴミが残っている可能性が高いので、一度以下のようにキャッシュをリフレッシュしてみてください。

Android Studioによるキャッシュの開放方法

下図の通り、Android Studioで[ファイル] – [キャッシュの破棄/再始動] を選択してキャッシュの開放を実行します。
※Android Studioを日本語化していない場合は、[File] – [Invalidate Caches / Restart]となります。

【Android開発】ウィジェットクラス

ウィジェットクラスは大きくわけて3つに分類されます。

ウィジェットクラス分類

  1. TextViewクラスを継承するもの

  2. Adapterクラスを継承するもの

  3. 上記以外でViewクラスを継承するもの

1.TextViewクラスを継承するウィジェット

TextViewクラスを継承する主要ウィジェックラス
(EditText・Button・CheckBox・RadioButton)

TextView

TextViewクラスは、ラベルとして出力専用で使用されます。
また、EditTextやButtonなどが継承する親クラスとしての役目をもちます。

EditText

EditTextクラスは、テキストボックスの表示または入出力を行うクラスです。

Button

Buttonクラスは、処理を実際に行うイベント処理用のクラスです。

Buttonクラスでよく使用するメソッド

メソッド 属性 概要
setTag(String) android:tag ボタンにタグを設定
setTag ボタンからタグを取得
setOnClickListener(Class) android:onClick ボタンにイベント処理を登録

※setOnClickListenerについて
登録するメソッドの指定方法が、xmlとコードの場合で異なる点に注意です。
xmlの場合、Activityを継承したクラスのメソッド名となり、コードの場合はView.onClickListenerを実装したクラス名になります。

CheckBox

その名の通り、checkBoxを表示するクラスです。
使用メソッドは以下の通りです。

メソッド 属性 概要
setChecke(boolean) android:checked チェック状態の設定
isChecked() チェック状態の取得
setOnCheckedChangeListener(Class) チェックイベント処理を登録

RadioButton

その名の通り、ラジオボタンを表示するクラスです。
使用メソッドは以下の通りです。

メソッド 属性 概要
check(int) 引数に指定したIDのボタンをチェック状態とする
clearCheck() 全てのチェックボタンを非チェック状態とする
getCheckedRadioButtonId() チェック状態のボタンのIDを取得する
setOnCheckedChangedListener(Class) チェックイベント処理を登録する

2.Adapterクラスを継承するウィジェット

AdapterViewクラスを継承するグループにはSpinnerクラス/GridViewクラス/ListViewクラスが存在。
自身のフィールドの表示に関するすべての属性はArrayAdapterやbaseAdapterを使用して行います。
Adapterにイメージや配列を持つことでリストやグリッドを表示する仕組みです。

  • Spinner
  • Spinnerは、ドロップダウンリストを表示するクラスです。
    アダプタとしてArrayAdapterを使用します。

    ArrayAdapterへのデータ登録方法(3種類)
    1.Arrayリソースを指定
    2.ArrayListクラスにリストデータを格納して指定
    3.ArrayAdapterのAddメソッドで直接追加

  • GridView
  • ListView

3.Viewクラスを継承するウィジェット

【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に呼称が変更