徒然なるままに

個人の備忘録を中心としたブログです

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【ダイアログでの表示】

import android.app.AlertDialog; //ダイアログ本体
import android.content.DialogInterface; //ダイアログにてアクションが起こったときの制御用



new AlertDialog.Builder(this)
.setTitle(R.string.dialog_title)
.setItems(R.array.volume, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int index) {
startGame(index); //Dialogで選択された値を元にゲームをスタート
}
}).show();



.(ドット)で関数が長く繋がっているが、これらの関数は自分自身のインスタンスを返していることに注目。
1.AlertDialog.Builderクラス:コンストラクタに呼び出し元のアクティビティを渡す。
2.setTitle():ダイアログのタイトルを入れる。
3.setItems():array要素をリスト的にセットする。第一引数に<string-array>で設定したarray要素(上の例ではvolume)。
第二引数はDialogInterface.OnClickListnerクラスを無名クラスとして実装し、onClick()関数を定義する。
DialogInterface.OnClickListner.onClick()には渡されてきたDialogInterfaceと、array要素のインデックス(上から順に0,1,・・・)を指定。
4.show()でダイアログを実際に表示する(これを忘れるとダイアログが表示されない)

3'.setItems()はリストからアイテムを一つ選択するものだったが、単にメッセージを表示したい場合などはsetItems()の代わりにsetMessage(R.string.message).show()としてやればよい。

【デバッグの際などで使用するログメッセージの使い方】
アクティビティの途中の状態を、ログとしてLogcat上のコンソールに表示したいという時にログメッセージを用いる。
(アプリ上で表示してもよいのだが、いちいちダイアログを作ったりするのは骨が折れる)


import android.util.Log;



private void function1(int index){
Log.d("TAG1","clicked on " + index);
}


Log.d(デバッグ)、Log.e(エラー)、Log.i(情報)、Log.v(冗長)などそれぞれの深刻度に合わせてログメッセージを出力する。
第一引数はLogcatのログのタグ名として表示される。
スポンサーサイト
【Androidにおけるメニュー画面およびプリファレンス(設定項目)の作成】
Androidに備わっているクラスを利用して、メニュー画面を簡単に作れるようになっている。

メニューについてはAndroidの仕様変更が結構あり、ちょっと前の参考書で対応できない部分になかなか手間取った。
まず、ハードとしてのmenuボタンの廃止により、基本的にはアクションバー右上にメニューが表示されるようになった。
また3.0でFragmentという、アクティビティを複数の部分で作成する機能が実装されたことにより、
Android(3.0)より前と、3.0以後によってメニューの実装方法が異なることに注意。

共通する部分
・メニュー項目の作成
・呼び出し元アクティビティ内の記述
・プリファレンスのレイアウト(正確にはレイアウト元)xmlファイル


・メニュー項目の作成
layout/menuにmenu.xml(ファイル名任意)ファイルをつくる


<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/settings"
android:title="@string/settings_label"
android:orderInCategory="10"
android:showAsAction="always" />
</menu>


1.id:メニュー項目を一意に判別するために付与する。
2.title:メニュー項目に表示する文字。
3.orderInCategory:メニューアイテムの重み付け。複数のメニューアイテムがあるとき数値が大きい方が先に表示される、
4.showAsAction:3.0以降でアクションバーにメニューアイテムをどのように表示するか、しないか。
それより前のverではこの属性に関係なく、単純に、Menuボタンを押すとメニュー項目が出てくる(と思う。。)

これでメニューが作られた。


・呼び出し元アクティビティ内の記述

import android.view.Menu;
import android MenuItem;

public class Main extends Activity{
・・・・・
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.activity_sudoku, menu);
return true;
}
}



1.getMenuInflater()
XMLからメニュー定義を読み出し、実際のビューに変換するために使うMenuInflaterのインスタンスを返す。
inflaterは複数のレイアウトXMLファイルをレイアウトに使用する際に使うものということらしい。

2.MenuInflater.inflate()
実際にインフレートする。
void inflate(int menuRes, Menu menu)
Inflate a menu hierarchy from the specified XML resource.


メニュー項目を選択すると、anOptionsItemSelected()が呼び出される。
この関数もオーバーライドして、動作を決める。


public class Main extends Activity{
・・・・・
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.settings:
startActivity(new Intent(this, Prefs.class));
return true;
}
return false;
}

}

onOptionsItemSelected()では、タッチされたメニュー項目のidをswitch文で判別し、動作を振り分けるのが一般的のようだ。
ここでは通常のメニュー項目として考えられるプリファレンス(設定項目)へ飛ぶとする。

・プリファレンス(設定項目)のレイアウト(正確にはレイアウト元)xmlファイル
プリファレンスはres/xmlにsettings(ファイル名任意).xmlとして書き込む。


<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<CheckBoxPreference
android:key="key1"
android:title="@string/key1_title"
android:summary="@string/key1_summary"
android:defaultValue="true" />
<CheckBoxPreference
android:key="key2"
android:title="@string/key2_title"
android:summary="@string/key2_summary"
android:defaultValue="true" />
</PreferenceScreen>


プリファレンスは<PreferenceScreen>~</PreferenceScreen>内に書く。
PreferenceCategoryを使えば、Categoryとしてまとめることもできる。

1.key:参照する際のキーとなる。
2.title:プリファレンスの項目名
3.summary:プリファレンスの説明文(項目名の下にやや小さな文字で書かれる概要)
4.defaultValue:デフォルト値を(ここではCheckBoxなのでtrueかfalseで)指定


ここまで共通。

以下androidのver.によってプリファレンスのアクティビティ.javaファイルの記述が異なる。

・3.0より前・・・→ PreferenceActivityの派生クラスを使う
・3.0~ ・・・・→ PreferenceFragmentの派生クラスを使う

PreferenceActivity
PreferenceFragmentの違いです。

PreferenceFragmentを使用する際には、extendsをPreferenceFragmentに書き換えるだけでなく、
Fragmentを使用するために少々クラスの構成を変える必要があります。
(自分はこれが分からずに、二日ぐらい唸っていました

・3.0より前

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class Prefs extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}

もちろん アクティビティ.PrefsをAndroidManifest.xmlに登録することを忘れずに。


1.addPreferenceFromResource()はXMLからプリファレンスの定義を読み出し、現在のビューに追加する。


・3.0~
注意点としては「FragmentはActivity内にstaticクラスとして作成すること」、「getFragmentManager().beginTransaction().replace(android.R.id.content,new PrefsFragment()).commit();」をActivityのonCreate()内に書き込む。

import android.os.Bundle;
import android.app.Activity;
import android.preference.PreferenceFragment;

public class Prefs extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content,
new PrefsFragment()).commit();
}



public static class PrefsFragment extends PreferenceFragment{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings(プリファレンスのxmlファイル名));
}
}
}



1.getFragmentManager().beginTransaction().replace(android.R.id.content,new PrefsFragment()).commit();
どうやらこのコードはFragment(PreferenceFragmentに限らず)を使用する時の雛形コードらしい。
2.android.R.id.contentは、layout/xmlファイルが含まれている場所を指す。

正直ここら辺はフラグメントの機能を勉強してないので、コードを丸写しした。。


・新規アクティビティの起動方法

usepackage android.content.Intent;

イベントリスナーでonClick()などの内側に、
StartActivity(new Intent([元のアクティビティ].class, [新規アクティビティ].class));
という処理を入れる。

つまり最初にIntentクラスのインスタンスを作る。
Intent i = new Intent([元のアクティビティ].class, [新規アクティビティ].class);
StartActivity(i);
冗長だがもちろんこのような形でもよい。

忘れてはいけないのがAndroid.Manifest.xmlに
<activity android:name=".[新規アクティビティ]"
     android:label="@string/hoge_label">
     //hoge_labelがアクティビティのタイトルとして表示される
</activity>
を追加すること。


・アクティビティのライフサイクル
onCreate()→onStart()→onResume()→実行中→onPause()→onStop()→onDestroy()→破棄
        ↑      ↑__________________↓   ↓
        ↑________onRestart()________↓

・onCreateの基本構文
public void onCreate(Bundle savedInstanceState){
 //スーパークラスのonCreate()呼び出し
 super.onCreate(savedInstanceState);
 setContentView(R.layout.xmlfile);
}

・イベントリスナーとビューの関連付け
import android.view.View;
import android.view.OnClickListner;

publiv void onCreate(){
 ・・・・・
 View v = findViewById(R.id.hoge);
 //イベントリスナーを無名クラスで実現する方法
 v.setOnClickListner(new OnClickListner()){
  public void onClick(View v){
   (クリック時の動作)
  }
 };

}

kamiyasu

Author:kamiyasu

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。