最終更新日:2025年4月29日
各演習課題を実施・確認・提出して下さい。実行確認は、TA・教員からのチェックを受けて下さい。
【チェック合格条件】各スクリーンショットと内容が一致すること(色は問わない)
CANVASのAssignmentsの指示に従うこと。
ActivityはAndroidアプリの基本的なコンポネントである。Activityの役割はUser Interfaceを提示することとともに、システムやユーザの入力に反応することである。
ユーザインタフェイスを用いるアプリは少なくとも1つのActivityもしくは複数のActivitiesで構成される。
存在しているActivityは他の新しいActivityに入れ替えられることが可能である。
なお新しいActivityは同じ制約(Manifest.xmlに記載されているIntent)を守らなければならない。
Android Projectに新しいActivityを追加する手順は下記の通りになる。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.aoyama.a5822000.sample1_1" >
<application>
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
//既存のActivity
<activity
android:name=".Sample1_1" android:label="@string/app_name" >
<intent-filter>
//アプリ起動時、最初に起動可能と設定したいActivity
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//以下新しく追加したActivity
<activity
android:name=".Settings" android:label="@string/settings" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
</application>
</manifest>
今回の目標はAndroidアプリのGUI開発の基礎を把握することです。本資料を注意深く読めば、各演習課題は十分実施できる内容です。UI開発に関するより詳細な説明は、Android Developersサイトの「Develop a UI with Views」を参照することをお勧めします(それでも分からない場合はネット・○○GPTで検索してみましょう)。
各Activityに対して、テキストなどのUI要素が描けるように、デフォルトのウィンドウが与えられている。
基本的にウィンドウは画面全体を埋めるが、画面より小さくしたり、他のウィンドウの上にポップアップのように浮かせたりすることが可能。
Activityの視覚的な内容はViewというObject類の階層組織が提供と制御を行なっている。
Androidの開発において、プログラミング(実現したい機能、動作など)はJavaファイルとして作成、レイアウトのデザイン(実装したい見た目、画面構成など)はXMLファイルとして作成する。
下記の属性を持った新しいAndroid Projectを作成する。ただし、自分の名前の頭文字・自分の学生番号を使用すること(LGのままにしないこと!LGとはLopez Guillaumeの頭文字...)。
Activity: Empty Views Activity
Name: LG First Android GUI
Package name: jp.aoyama.a5822000.lgfirstandroidgui
Save location: 任意
Language: Java
XMLで定義した各Viewオブジェクトに対応したIDを設定することができる。そのため、XMLファイル内のViewの開始~終了タグ間下記のようなコードを追加する。例えば、「res/layout」にある"activity_main.xml"にある"TextView"オブジェクトの場合、以下のように、android:id="@+id/author"
を追加することがで、IDが付与されます。UIのDesignモードでそのオブジェクトを選択したうえで、Attributes(属性)リストの一番上にある「id」に直接入力することも可能です。
<TextView
android:id="@+id/author"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="©LG23428"
...
/>
TextView appliAuthor = (TextView)findViewById(R.id.author);
appliAuthor.setText("");
d~fの説明を参考にして(他の方法有り)、図8と同じくなるように必要なところを書きかえる。
XMLレイアウト編集ウィンドウ右上にあるタブを用いて "Code"(図6)と"Design"(図7)で直接XMLタグコーディング("code")で行なうか、レイアウトの設計を drag & drop などでグラフィカル("design")で行なうかは切り替えができる。基本的に design モードを利用した方が便利で速い。
Button をクリックした際のアクションも下記のようにXML内に事前定義することができる。定義したクリック時イベント名が Java プログラムコード内の method 名と紐づけられる。 クリックアクション用のメソッドの引数として、View オブジェクトを設定することで複数の View(例:複数のボタン)が同じクリック時アクション method を用いる際。 その method の処理コード内に、例えばどの Button がクリックされたかによって、処理を変えることができる。
XMLレイアウト(activity_main.xml内) | Javaプログラムコード(MainActivity.java内) |
---|---|
|
|
Androidアプリ開発では、アプリの画面を簡単に作成できるレイアウトが数多く用意されている。レイアウトを上手く活用することで、テキスト、ボタン、イメージなどの各 View 要素の配置がシンプルとなるだけではなく、端末の Portrait/Landscape 切り替えや、様々な端末のサイズに合わせて自動的に調整される。
GUI(activity_main.xml)のデフォールトレイアウトは ConstraintLayout ですが、本実験(演習2_2~7)では、LinearLayout (リニアレイアウト)を上手に活用すれば、GUIの要素の配置が素早くできるため、その仕組みを理解することが大事(以下簡易紹介されている)。
主なレイアウトを紹介する。画像も見ながらイメージをつかむこと。各レイアウトの詳細な使い方はAndroid Developerウェブサイト、Tutorialウェブサイトや、市販の教科書を参照。
(続く各レイアウトのサンプル画像はTECHACADEMY MAGAZINEの“覚えておくと便利!ANDROIDアプリ開発のLAYOUTの使い方”から引用)
他のパーツなどと相対的な関係で位置を配置したい場合に使用する。「パーツBはパーツAの下に配置する」という指定の仕方ができる。この場合、パーツAを動かすと一緒にパーツBも移動する。
ConstraintLayout を使用すると、フラットなビュー階層を持つ大きくて複雑なレイアウトを作成できる(ビューグループのネストはない)。すべてのビューが兄弟ビューや親のレイアウトとの関係に従って配置される点で、これは RelativeLayout と似ているが、RelativeLayout よりも柔軟性があり、Android Studio の Layout Editor で使用しやすくなっている。
ConstraintLayout 内でビューの位置を定義するには、ビューに対して最低 1 つの水平方向の制約と 1 つの垂直方向の制約を設定する必要がある。各制約は、別のビュー、親のレイアウト、非表示のガイドラインとの接続や位置揃えを表す。各制約により垂直軸または水平軸に沿ったビューの位置を定義する。各ビューには軸ごとに少なくとも 1 つの制約が必要ですが、それより多く必要になることもよくある。
Layout Editor にビューをドロップすると、制約を設定していなくても、ビューはドロップした場所に配置される。ただし、これは編集を簡単にするだけの機能です。デバイスでレイアウトを表示すると、制約が設定されていないビューは、[0,0](左上の隅)の位置に描画される。
Viewの制約を設定するには、
図 12 のレイアウトは、エディタ内では正常に見えますが、ビュー C には垂直方向の制約がありません。このレイアウトをデバイス上で描画すると、ビュー C の水平方向は、ビュー A の左右の外辺と同じ位置になるが、垂直方向の制約がないため、画面の一番上に表示される。
詳しくはAndroid Developers Guideの「ConstraintLayout でレスポンシブ UI を作成する」を参照すること。
LinearLayoutとは、パーツを縦一列(vertical)もしくは横一列(horizontal)に並べる場合に使用するレイアウト。View の要素(テキスト、ボタン等)を1列に並べたいとき一番便利。「orientation」属性を「vertical」と「horizontal」に切り替えることで、並べ方を縦と横に切り替えることができる。
また、レイアウトの「gravity」属性を用いることで、レイアウト内の View 要素を左詰め(left)・中央揃え(center_horizontal)・右詰め(right)・幅を埋める(fill)・上詰め(top)・下詰め(bottom)等々、様々な並び方の自動調整が可能になる。
例えば、二つのボタンを画面の中央に横並びにしたい場合、horizontalなLinearLayoutの中に2つのボタンを配置し、gravityをcenterにすれば良い。
TableLayoutはパーツを格子状に配置したい場合に使用する。HTMLの<table>タグと同じようにレイアウトを作成することができる。
GridLayout はTableLayoutと同じくパーツを格子状に配置したい場合に使用する。TableLayoutとの違いはTableLayoutは縦方向のセルの結合はできないが、GridLayoutでは可能である。
基本的には1つのパーツを配置するためのレイアウトである。複数のパーツを配置した場合、後から配置したパーツが前面に重なった状態で配置される。
FrameLayoutを応用として右図のようにボタンを押すことで表示される内容が変わる画面。
setContentView(R.layout.activity_main);
L1 | |
| |
|
下記説明の「ActionBarによるUI実装」を参考にしつつ、図18~19の表示と動作ができるように、ActionBarの設定とイベント処理を実装する。
Action Bar とは、Android 2.x 以前のタイトルバーを置き換えつつ、ロゴ、ボタン、タブなどを配置できるツールバーである。
具体例としてActionBar は下図の赤枠で囲まれたものである。 縦向きと横向きで表示のされ方が異なることに注意が必要。メニュー要素は、レイアウトと同じように、xml ファイルのリソースとして事前設定が可能(java で動的に作成することも可)。メニューのリソースファイルは res/menu フォルダーに置く。作成した Empty View Activity の初期状態では menu リソースはないため、新規に作成する必要がある。Android Studio の左側に(通常)表示される navigation bar の「res」フォルダーに右クリックし、「New>Android Resource File」にて新規作成できる(図20を参照)。
図21に示すように、menu タイプのリソースファイルを作成するため、「Resource type」を「Menu」に設定する必要がある。OK を押して、res フォルダーに menu フォルダーと menu_action_bar.xml (図21設定の名前の場合)ができていることを確認する。
具体例として Action Bar の例は図22に示す。アイコン・文字の全てが表示される場合もあれば、一部隠れている場合もある。例えば、縦向きと横向きで表示のされ方が異なることに注意が必要。以下はメニューリソースに実際メニュー要素(menu item)を追加した場合のソースコード例(抜粋)。各メニュー要素を item タグにて定義し、その主な属性は次のものがある。
Action Bar に表示する MenuItem が2つまでなら、図22上部の Action Bar に表示されるため分割されない。一方、縦画面では3つ目以降表示されなくなる。
分割した場合、5つまでなら表示され、6つ目から表示されなくなる。Menu Item を2つに抑える、または3つ目以降の使用頻度が低いなどの場合は分割しない、横画面専用にする、などの方針をアプリ設計時に行うようにする必要がある。
Action Bar は従来のメニューを置き換えるものであることから、アイコンは、従来のメニューの Menu Item と同じものを使用する。以下は本サンプルの「menu_action_bar.xml」の内容。
重要なのは、item要素の「app:showAsAction」という属性。この属性を用いて Action Bar 上でメニューアイテムがどのように配置、表示されるかを指定できる。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_settings" android:title="@string/action_settings"
android:icon="@android:drawable/ic_menu_preferences"
app:showAsAction="ifRoom|withText" />
</menu>
値 | 意味 |
---|---|
never | 常に表示しない |
ifRoom | 表示する余裕があれば表示 |
always | 常に表示 |
withText | android:titleのテキストを表示。"|"を使用して他の値と同時に指定可能 |
collapseActionView | android:actionViewLayoutで指定されているアクションビューと関連付ける。"|"を使用して他の値と同時に指定可能 |
Action Barを表示させるため、下記のメソッドを MainActivity に追加する必要があります。
OnCreateOptionsMenu は MainActivity の親クラス(Activity もしくは AppCompatActivity)の OnCreate で自動的に呼び出されるメソッドのため、これまで追加しなくても、デフォールトの Action Bar が表示されていた。プロジェクト作成時、Activity のタイトル(Name)を設定した(LG First Android GUI)ため、それだけ表示されている。
getMenuInflater() メソッドから引き出せる MenuInflater の instance を用いてに作成したメニュー(例えば上記作成した menu_action_bar.xml) の中身をAction bar にメニューをinflateさせない(“膨らませる”)とメニューが表示されない。
@Override
public boolean onCreateOptionsMenu(Menu menu){
//Inflate(膨らます)the menu. This adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_action_bar, menu);
return true;
}
Android 2.3以前のアプリ内でのナビゲーションはシステムの戻るボタン(Back ボタン)を使って行われていた。Android 3.0よりアクションバー(Action Bar)が導入され、
第2のナビゲーションメカニズムとして ホームボタン(正式にUpボタン)が登場した。このボタンはアプリアイコンと左向きのキャラットで構成されている。
Action Barにはアプリケーションのブランディングの意味も含め、アプリケーションアイコンが表示されている。
このアイコンにナビゲーション機能を持たせるためUpボタン機能を追加する方法として、onCreateOptionsMenu() メソッド内、ActionBar オブジェクトの下記メソッドを用いる。
ActionBarオブジェクトのインスタンスは getSupportActionBar() メソッドで取得可能(例:getSupportActionBar().setHomeButtonEnabled(boolean);)。
各メニュー要素のテキストもしくはアイコンがタップされた場合、ボタンと違って、onClick属性は使いません。MainActvity に onOptionsItemSelected(…) というメソッドを実装すれば、自動的にそのメソッドに通知される。下記コード例のように、引数の item を使って、どのメニュー要素がタップされたかを判定して、適切な処理を実装する(注意:ホームボタンのIDは「android.R.id.home」)。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==R.id.action_settings){
...
}
...
}
Back と Up を使用したナビゲーションについてガイドラインがありますので、詳細はAndroid Developer Siteを参照して下さい。
さらにAndroid Design Principles(style、color、navigation等)というものも存在しているので、Google Playで配布予定のApplicationを開発する際、そこを良く勉強しておくことをお薦めします。
「アニメーション」機能は、Androidが提供するそのほかの機能に比べると、実用度は低いように感じられますが、実はバージョン1.0よりも以前からアニメーションはAPIとして開発者に提供されています。
その後、追加された機能に優先してアニメーションが初めから用意されているのはなぜでしょうか。Androidはシステム全体を通してアニメーションが駆使できるように設計されています。
「メニューを開く」「アクティビティを起動する」「ダイアログを表示する」というような基本的な動作にもアニメーションが使用されています。
アクティビティの切り替え時や、ダイアログ表示時のアニメーションは次回解説します。今回は、GUIコンポネントに対するアニメーションを見ていきましょう。
Androidのアニメーションは、「android.view.animation」パッケージで実現する。このパッケージには、Animationクラスと、そのサブクラスが用意されている。
クラス名 | 概要 |
---|---|
Animation | すべてのアニメーションの基底の抽象クラス |
AlphaAnimation | フェードイン/アウト |
RotateAnimation | 回転 |
ScaleAnimation | 拡大・縮小 |
TranslateAnimation | 移動 |
AnimationSet | 複数のアニメーションを合成 |
下記の属性を持った新しいProjectを作成する。ただし、自分の名前の頭文字・自分の学生番号を使用すること。
Activity: Empty View Activity
Name: LG Animation
Package name: jp.aoyama.a00001.lganimation
Save location: 任意
Language: Java
Minimum SDK: 使用端末のAndroidバージョン以下を選択
アニメーション開始時とアニメーション終了時の透明度を設定して、フェイドイン/フェイドアウトを表現する。
「AlphaAnimationExample」例のソースコードの一部と画面のスクリーンショットを次に示している。
package jp.aoyama.a00001.animation;
//importを省略
import android.view.animation.AlphaAnimation;
public class AlphaAnimationExample extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hoge);
}
public void onClick(View v) {
float fromAlpha = Float.parseFloat(((EditText)hoge).getText().toString());
float toAlpha = Float.parseFloat(((EditText)hoge).getText().toString());
AlphaAnimation animation = new AlphaAnimation(fromAlpha, toAlpha);
//アニメーション時間の設定
animation.setDuration(5000);
//Viewがアニメーションを開始
v.startAnimation(animation);
}
}
AlphaAnimationは開始透明度と終了透明度を指定可能で、図 22は不透明から、80%透明にアニメーションする。
コンストラクタ引数 | 説明 |
---|---|
float fromAlpha | アニメーション開始時の透明度を0.0~1.0の間で指定。0.0は完全透明、1.0は完全不透明 |
float toAlpha | アニメーション終了時の透明度を0.0~1.0の間で指定。0.0は完全透明、1.0は完全不透明 |
public void onClick(View v) {
// 【1】インスタンスを生成
AnimationSet set = new AnimationSet(true);
// 【2】基本のアニメーションを生成
AlphaAnimation alpha = new AlphaAnimation(0.9f, 0.2f);
RotateAnimation rotate = new RotateAnimation(0, 360, 50, 25);
ScaleAnimation scale = new ScaleAnimation(0.1f, 1, 0.1f, 1);
TranslateAnimation translate = new TranslateAnimation(50, 0, 200, 0);
// 【3】生成したアニメーションを追加
set.addAnimation(alpha);
set.addAnimation(rotate);
set.addAnimation(scale);
set.addAnimation(translate);
// 【4】アニメーション時間を設定して動作開始
set.setDuration(3000);
v.startAnimation(set);
}
上記サンプルコードはhttps://www.atmarkit.co.jp/ait/articles/1009/15/news120_2.htmlからの引用。
チェックボックスの使い方についてはAndroid Developerサイトを参考に。