設計の分類
状態:-
閲覧数:1,340
投稿日:2013-11-26
更新日:2018-08-30
Viewを配置する方法は2種類
A.XMLファイルによるレイアウト
B.JAVAファイルによるレイアウト
「ビュー(レイアウト)構造」をどこで定義するか
・タイミングは、プロジェクトを作成した時点
「XMLファイル」の存在確認
・もしくは「/res/layout/」フォルダ自体の存在確認
内容 | Javaファイル(動的リソースの変更) | XMLファイル(リソースとして静的定義) |
---|---|---|
「/res/layout/」フォルダ自体があるか? | なし | あり |
「/res/layout/」以下に「xml」ファイルがあるか? | なし | あり |
A.XMLファイルによるレイアウト
XMLファイルに記述(静的)
・画面レイアウトをリソースとして静的定義(XML)=静的リソースの変更
・事前にXMLファイルを使ってビュー構造を定義した後、そのXMLファイルをアクティビティへ設定していく方法
※どちらも考え方は同じだが、ソースコードが異なる
B.JAVAファイルによるレイアウト
Javaファイルに記述(動的)
・画面レイアウトを動的定義(Java)
・まず初めに各ビューのオブジェクトを作成した後、それをアクティビティへ追加していく方法
・配置方法を指定しない
※両者の違いは、「画面レイアウト」を、「プログラムの中で記述」 するか 「XMLファイルで定義」するかの違い
A.XMLファイルによるレイアウト / 画面レイアウトをリソースとして静的定義(XML)=静的リソースの変更
例1
XMLファイルをアクティビティに設定
setContentView(R.layout.test1_1);
package android.style;
import android.app.Activity;
import android.os.Bundle;
public class SetContentView1_1Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test1_1);// 「二つのボタンを追加したビューグループ」をアクティビティへ追加。具体的には、画面ビューを、「 レイアウトXMLファイルのリソースID」 で指定
}
}
例2
「レイアウト用のリソースの中に記述された個々のビュー」に対してIDを設定(id="@+id/名前")
・2つのボタンと1つのテキストビューを設置し、それぞれのボタンがクリックされるとテキストビューにメッセージが表示されるプログラム
・画面レイアウト全体が1つのリソースとなっている場合には、画面レイアウトに配置された個々のビューに対してイベント処理を行おうとする場合、個々のビューをリソースの中から取り出す必要がある
↓
・ 「レイアウト用のリソースの中に記述された個々のビュー」に対してIDを設定 … id="@+id/名前"
・ 「ビューに対して割り当てられたリソースID」から対応するビューオブジェクトを取得 … Button jp_button = (Button)findViewById(R.id.jp_button);
▼D:/Android/workspace/SetContentView1_2.java
package android.style;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
public class SetContentView1_2Activity extends Activity {// 2つのボタンと1つのテキストビューを設置し、それぞれのボタンがクリックされるとテキストビューにメッセージが表示されるプログラム
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test6_1);// 「画面レイアウトをリソースとして定義した」レイアウト用xmlファイル」をプログラムの中から参照し、アクティビティへ設定
Button jp_button = (Button)findViewById(R.id.jp_button);// ビューに対して割り当てられたリソースIDから対応するビューオブジェクトを取得。具体的にはソースの名前が「jp_button」のビューのオブジェクトを取得。戻り値は、そのビューのクラスでキャスト
Button en_button = (Button)findViewById(R.id.en_button);
final TextView msg_text = (TextView)findViewById(R.id.msg_text);
jp_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
msg_text.setText("こんにちは");
}
});
en_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
msg_text.setText("Hello");
}
});
}
}
レイアウト用XMLファイル 作成
・ 「レイアウト用のリソースの中に記述された個々のビュー」に対してIDを設定 … id="@+id/名前"
・ @stringは「ハードコーティングに対する警告」対応
setContentView(R.layout.test6_1);
▼D:/Android/workspace/SetContentView1_2/res/layout/test6_1.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/jp_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Japanese"
/>
<Button
android:id="@+id/en_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/English"
/>
<TextView
android:id="@+id/msg_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
/>
</LinearLayout>
ビューにIDを割り当てると、他のリソースと同じようにプロジェクトのビルド時にR.javaファイルに個々のビューに対するリソースIDが設定される
・ jp_button、 en_buttonなど
・ stringクラスのJapaneseなどは、「ハードコーティングに対する警告」対応の結果、設定されたもの
▼/SetContentView1_2/gen/android/style/R.java
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package android.style;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
}
public static final class id {
public static final int en_button=0x7f050001;
public static final int jp_button=0x7f050000;
public static final int msg_text=0x7f050002;
}
public static final class layout {
public static final int main=0x7f030000;
public static final int test6_1=0x7f030001;
}
public static final class string {
public static final int English=0x7f040003;
public static final int Japanese=0x7f040002;
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
・レイアウトXMLファイルを削除して、JAVAだけでレイアウト定義できる?
・レイアウトファイルを使わないでコードでTextViewを作る
B.JAVAファイルによるレイアウト / 画面レイアウトを動的定義(Java)。 かつ、配置方法を指定しない
例1
ボタンをアクティビティへ追加するも、配置方法を指定しない
package android.style;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
public class SetContentView1Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("ボタン1");
setContentView(button);
}
}
例2
テキストビューをアクティビティへ追加するも、配置方法を指定しない
package jp.androidstyle.tokyo;// パッケージ(package)宣言
import android.app.Activity // Android SDKに含まれるandroid.appパッケージのActivityクラス
import android.os.Bundle; // Android SDKに含まれるandroid.osパッケージのBundleクラス
import android.widget.TextView;// TextViewクラスのオブジェクトを取り扱う場合は、インポート必須
public class SampleActivity extends Activity // SampleActivityクラスは、「Android SDKのandroid.appパッケージにあるActivityクラス」を継承したサブクラ{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {//「onCreate」メソッドを定義。状態を保持している Bundle オブジェクトが引数として渡される
super.onCreate(savedInstanceState);// superキーワードを使って、スーパークラスであるActivityオブジェクトのonCreateメソッドを呼び出し、 「onCreate」メソッドをオーバーライド
TextView tv = new TextView(this)// TextViewクラスのインスタンスオブジェクトを生成;
tv.setText("こんにちは"); // 表示するテキスト内容を指定
setContentView(tv); // アクティビティの中に、TextViewクラスのオブジェクトを配置
}
}
テキストビューのインスタンス名は任意で変更可
package jp.androidstyle.tokyo;// パッケージ(package)宣言
import android.app.Activity // Android SDKに含まれるandroid.appパッケージのActivityクラス
import android.os.Bundle; // Android SDKに含まれるandroid.osパッケージのBundleクラス
import android.widget.TextView; // TextViewクラスのオブジェクトを取り扱う場合は、インポート必須
public class SampleActivity extends Activity // SampleActivityクラスは、「Android SDKのandroid.appパッケージにあるActivityクラス」を継承したサブクラ{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {//「onCreate」メソッドを定義。状態を保持している Bundle オブジェクトが引数として渡される
super.onCreate(savedInstanceState);// superキーワードを使って、スーパークラスであるActivityオブジェクトのonCreateメソッドを呼び出し、 「onCreate」メソッドをオーバーライド
TextView display = new TextView(this);// TextViewクラスのインスタンスオブジェクトを生成
display.setText("オブジェクト名は、別にtvじゃなくて、好きに命名していいみたい");// 表示するテキスト内容を指定
setContentView(display);// アクティビティの中に、TextViewクラスのオブジェクトを配置
}
}