素粒子の世界で自由に生きる -14ページ目

素粒子の世界で自由に生きる

iphoneアプリのレビューをしていたんですが・・
だんだんandroidアプリ開発の話になってきました。。
さらに、素粒子の話になってきました笑
自分が読み返したくなるブログ記事を書いております♪
ほぼ自己満ですが、ぜひお楽しみください!

さて、今回はリストビューのカスタマイズについて少し触れてみます。

こんな感じのリストビューの使い方です。



Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_list


まずは、layoutを2つ使っています。

こちらがリストビューの入ったxmlです。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android "
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:background="@drawable/washiback">


<LinearLayout android:id="@+id/linearLayout2"
android:layout_height="fill_parent" android:orientation="vertical"
android:layout_width="fill_parent">


<RelativeLayout android:id="@+id/relativeLayout1"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:background="@drawable/maplewood">


<ImageButton android:layout_height="wrap_content"
android:layout_width="wrap_content" android:layout_alignParentRight="true"
android:id="@+id/addNoteBtn" android:background="@drawable/ic_addnote"></ImageButton>


</RelativeLayout>


<ListView android:layout_width="fill_parent" android:id="@+id/android:list"
android:layout_weight="1" android:layout_height="fill_parent"
android:background="#00000000">

</ListView>


<TextView android:layout_width="wrap_content" android:id="@+id/android:empty"
android:text="@string/no_notes" android:layout_height="wrap_content">

</TextView>


</LinearLayout>
</LinearLayout>


こちらがリストに表示するためのxmlです。


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android "
android:orientation="horizontal" android:gravity="right"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:background="@color/list_item">


<LinearLayout android:layout_width="wrap_content"
android:layout_weight="1" android:orientation="vertical" android:id="@+id/linearLayout1"
android:layout_height="wrap_content">


<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/linearLayout2"
android:layout_weight="1">


<TextView android:layout_height="wrap_content"
android:layout_weight="1" android:padding="10dip" android:maxLines="1"
android:layout_width="wrap_content" android:textColor="#000000"
android:id="@+id/text1" android:textSize="20sp"></TextView>


<TextView android:layout_height="wrap_content"
android:layout_width="wrap_content" android:textColor="#000000"
android:textAppearance="?android:attr/textAppearanceSmall"
android:id="@+id/hiduke"></TextView>


</LinearLayout>
<TextView android:layout_height="wrap_content"
android:layout_weight="1" android:layout_width="fill_parent"
android:id="@+id/bodyText" android:maxLines="1"></TextView>


</LinearLayout>

<ImageView android:src="@drawable/green_arrow"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>


このように、リストビューをカスタマイズする時には

layoutのxmlを2つ作成し、ひとつはリストの受け皿として、もう一つはリストの中身として

使う方法がよく使われているようです。

便利だ・・・



それで、xml2つ作ったは良いけどもどうやって結合するんだ!!?

ってところで躓きました。


えー。基本的にはリストの中身として作成したxmlをアダプターに引数としてセットして、そのアダプターをListViewにセットしてあげれば良いだけだったりします

こんな感じで。

まずはアダプターを作成します。

SimpleAdapter adapter;

アダプターにリストの中身として作成したxmlをセットします。

adapter = new SimpleAdapter(this, myData, R.layout.notes_row, new String[] { mDbHelper.KEY_TITLE,
mDbHelper.KEY_BODY, mDbHelper.KEY_DATE }, new int[] { R.id.text1, R.id.bodyText, R.id.hiduke });

SimpleAdapterのコンストラクター参照

SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)


context: The context where the View associated with this SimpleAdapter is running

ここでは、コンテキストは自分自身を渡してあげれば良いのでthisでおっけーです。


data: A List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in "from"

えー、ここではmapを使います。今回はこのような形でmapをいれるarraylistを作成しています。

List<HashMap<String, Object>> myData = new ArrayList<HashMap<String, Object>>();

で、mapはキーと値で作成されていますから、そのキーを後のfromで配列として渡してあげます。

fromで渡すキーはdataに格納されていなければいけないよってことですね。



resource: Resource identifier of a view layout that defines the views for this list item. The layout file should include at least those named views defined in "to"

ここのresourceR.layout.notes_rowですね。リストの中身として作成したxmlです。

で、このxmlの中には、後ろのtoで配列として渡してあげるidを持ったviewが入ってないといけないよってことです。

fromdata

toresource

この2つは関係があるんですね。


from: A list of column names that will be added to the Map associated with each item.

上で説明したとおり、使いたいキーの配列ですね。


to: The views that should display column in the "from" parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter.

fromで設定したキーの値を表示するためのviewのidですね。

textViewを使うようですね。


上で、fromdatatoresourceは関係があると書きましたが、fromtoも関係があるんですね。

正確に言うと・・・fromで並べた順番とtoの並び順に関係があります。

今回の例で見ると

new SimpleAdapter(this, myData, R.layout.notes_row, new String[] { mDbHelper.KEY_TITLE,
mDbHelper.KEY_BODY, mDbHelper.KEY_DATE }, new int[] { R.id.text1, R.id.bodyText, R.id.hiduke });

KEY_TITLEの値がtext1に入って

KEY_BODYの値がbodyTextに入って

KEY_DATEの値がhidukeに入ります。


ちなみに、このアクティビティはonCreateでリストの受け皿のxmlをセットしてます。

setContentView(R.layout.notes_list);

ですね。受け皿は普通にセットして、アダプターに色々セットしてあげる。。。。

おっと、アダプターをリストにセットしてませんね。


setListAdapter(adapter);


はい。これでオッケーです。


こんな感じでカスタマイズをしました。

参考になれば幸いです。


方法はいろいろあるみたいなんで、これも一つということで。





さて、お久しぶりになってしまいました。

試験的にアプリを作り始めています。

それなりに形になりましたので、一度まとめ。


スナップショットでのご紹介となります。

今回のアプリは・・・「メモ帳」

たかがメモ帳。されどメモ帳。

メモ帳アプリには基礎が詰まっています。

テキストの読み書きだけの簡単な機能ですがね!!


それではご紹介。


まず、アプリを立ち上げたトップページは作成したメモのリストが一覧で表示されます。


Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_list


こんな感じですね。

リストビューのカスタマイズについてはこちらで触れています


さて、このリストからメモを選んでクリックしますと・・・

ノートの表示画面に移ります


Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_textview


このビュー画面最初は無かったのですが、何度かテストしていて付け足しました。

というのも、次で表示されるエディット画面だとキーボードが立ち上がっちゃうんですよね。

そうするとメモの確認をしたいのに、メモの表示が画面の半分くらいになってしまいます。


それを避けるためにも見るだけの画面を作りました。

右上の編集アイコンを押すと次のエディット画面に進みます。


はい。こちらですね。
Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_editview

デザイン的にどうかなーと思ったんですが、エディット画面ではタイトルの周りに黒枠が表示されています。

(実際にはエディットテキストにマージンを与えて背景が移ってるだけですがww)


こうすることで、タイトルと本文の入力場所がハッキリとわかり易いかなと。

色合い的にも問題ない?んで(現段階では・・)このままにしてます。


で、トップのリストビュー画面に戻りまして。

メニューボタンを押してみます。

こんな感じですね。


Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_list_pref

メニューが出てきました。

メニューからと上のアイコンからと両方から新規作成が出来るようになってます。

新規作成はいきなりエディット画面に行くようになっています。



設定を押してみましょう。


はい。



Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_pref_on

まだ一つしかないですね。

文字もきれています・・・

とりあえず、リストのタイトル表示を選択できます。

オフにしてみましょう。



Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_pref_off

オフにしました。

リストビューに戻ってみます。




Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_list_titleoff


はい、本文しか表示されなくなりました。

この設定の仕方も最初わからず苦労しました・・・

わかれば簡単、これ基本。


さて、次はちょっとした小細工の発表です。

神は細部に宿る。。

細かいところもがんばりましょう。


いったんホームボタンを押して戻ります。

アンドロイド自体の設定画面に行きます。



Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-android_pref


さて、日付と時刻を選びます。

大体予想は付いたと思いますが、日付形式を変えて見ましょう。


Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-android_date_pref


デフォルトから月・日・年の形式に変えてみました。

もう一度アプリを立ち上げてみます。


はい。これです。



Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-notepad_list_datechange

わおー。

指定どおりに変わりました。

本体の設定を呼び出してフォーマットしています。

なるべく普段見慣れた設定を使ったほうがいいですからね。

こうしておけば国際化にも無問題。



まだまだ実装予定の機能を実装できていませんですが。

実装後テストしてみてOKならマーケットに登録第一弾としてする予定です。

さー、がんばろう。



さて、今回はくじ引きプログラムを作成してみました。


package kujibiki;

import lib.Input;

public class Kujibiki04 {

private static int max = 10;
private static int atari = 3;
private static int[] lot = new int[max];
private static int n = 0;

// static String start;

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
init();
do {
System.out.println();
Input.getString("何かのキーをタイプするとくじが引けます");
System.out.println();

animation();
draw();

} while (n < atari);
}

private static void init() {
for (int i = 0; i < 10; i++) {
if (i < atari) {
lot[i] = 1;
} else {
lot[i] = 0;
}

}
}

private static int number() {

int p = (int) (Math.random() * max);
int ret = lot[p];
lot[p] = lot[max - 1];
max--;
return ret;

}

private static void animation() {
for (int i = 0; i < 10; i++) {
System.out.print("■");
delay(100);
}

}

private static void delay(int t) {
try {
Thread.sleep(t);
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}

private static void draw() {
int s = number();
if (s == 1) {
System.out.println("\n" + "大当たり!");
n++;
} else if (s == 0) {
System.out.println("\n" + "残念!!");
}
}

}

人気ブログランキング

ヨロシクオネガイシマス(ツ _ _)ツ))

アンドロイドでカウンターを作成してみました。


Javaを使った(eclipseで)Androidアプリの開発を薦めるブログ-androidcounter



package android02.test;

import java.math.BigDecimal;
import java.text.DecimalFormat;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView.Validator;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;


public class AndroidTest02Activity extends Activity {
/** Called when the activity is first created. */


TextView view1, view2, view3, view4;//各ボタンのカウント数のフィールド
TextView kekka;//結果のフィールド
double a = 0, b = 0, c = 0, d = 0;// ボタンの値
double kaiten;// 自分で記入する回転数
String a1, b1, c1, d1;// ボタンの値/回転数
EditText kaitensuu;// 回転数を記入する場所


@Override


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
kaitensuu = (EditText) findViewById(R.id.editText1);
view1 = (TextView) findViewById(R.id.textView1);
view2 = (TextView) findViewById(R.id.textView2);
view3 = (TextView) findViewById(R.id.textView3);
view4 = (TextView) findViewById(R.id.textView4);
kekka = (TextView) findViewById(R.id.kekka);
((Button) findViewById(R.id.up1)).setOnClickListener(btn1Listener);
((Button) findViewById(R.id.up2)).setOnClickListener(btn2Listener);
((Button) findViewById(R.id.up3)).setOnClickListener(btn3Listener);
((Button) findViewById(R.id.up4)).setOnClickListener(btn4Listener);
((Button) findViewById(R.id.down1))
.setOnClickListener(btn1downListener);
((Button) findViewById(R.id.down2))
.setOnClickListener(btn2downListener);
((Button) findViewById(R.id.down3))
.setOnClickListener(btn3downListener);
((Button) findViewById(R.id.down4))
.setOnClickListener(btn4downListener);
((Button) findViewById(R.id.kakunin))
.setOnClickListener(kakuninListener);
}




OnClickListener btn1Listener = new View.OnClickListener() {
@Override
public void onClick(View v) {

a++;
view1.setText(String.valueOf(a));
// DrawTest drawView = new DrawTest(view2);
// ウィンドウに自作のViewをセット
// setContentView(drawView);
// setContentView(R.layout.main);
// Resources r = getResources();
// Bitmap bitmap = BitmapFactory.decodeResource(r,
// R.drawable.photo);
// BitmapDrawable drawable = new BitmapDrawable(bitmap);
// view2.setImageDrawable(drawable);

}

// private void drawImage(ImageView view2, Bitmap bitmap) {
// // TODO 自動生成されたメソッド・スタブ
// // view2.get
// // drawBitmap(bitmap, 0, 0, null);
// }
};

OnClickListener btn2Listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
b++;
view2.setText(String.valueOf(b));

}
};
OnClickListener btn3Listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
c++;
view3.setText(String.valueOf(c));

}
};

OnClickListener btn4Listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
d++;
view4.setText(String.valueOf(d));

}
};

OnClickListener btn1downListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
a--;
view1.setText(String.valueOf(a));

}
};

OnClickListener btn2downListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
b--;
view2.setText(String.valueOf(b));

}
};

OnClickListener btn3downListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
c--;
view3.setText(String.valueOf(c));

}
};

OnClickListener btn4downListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
d--;
view4.setText(String.valueOf(d));

}
};
OnClickListener kakuninListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
String soukaiten = kaitensuu.getText().toString();
kaiten = Integer.parseInt(soukaiten);
DecimalFormat DeciFormat = new DecimalFormat("###%");
// System.out.println(exFormat4.format(exValue4)); //(5)
a1 = DeciFormat.format(a / kaiten);
b1 =DeciFormat.format(b / kaiten);
c1 =DeciFormat.format(c / kaiten);
d1 =DeciFormat.format(d / kaiten);

kekka.setText("a=" + a1 + " b=" +b1
+ " c=" + c1 + " d=" + d1);

}
};

}

package jibunyou;

public class S_15_2mesoddo_yobidashi {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
System.out.println("start"); //startと表示する
message(); //messageメソッドを呼び出している
System.out.println("end"); //endと表示する

}
public static void message(){ //messageというメソッドを作成している
System.out.println("こんにちは"); //こんにちは表示する
return; //呼び出し元(ここではmainメソッド)へ戻る return文は省略することができる
}

/*
* メソッドの書き方
*
* ①public static voidに続けて任意のメソッド名を書く
* 例)public static void message
*
* ②メソッド名には()をつける
* 例)public static void message()
*
* ③{で始まり}で終わるブロックを作ってその中に処理を書く
* 例)public static void message(){
* .........................
* }
*
*
* メソッド名は識別子の書き方の規則を守って書く。
* 先頭文字を数字にしない
* _ $以外の記号は使えない
* 予約語は使えない
*
* メソッドの並び順に意味はない。(mainメソッドも含めて)
*
*/

}





package jibunyou;

public class S_15_mesod_ataiwokaesu {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
double myTax; //変数myTaxを宣言
myTax = tax(1200); //変数myTaxにtaxメソッドの値を代入(ここの右辺でtaxメソッドを呼び出している)
System.out.println("税額は" + myTax + "円" ); //myTaxを表示
}

//消費税額を計算する
public static double tax(double gaku){ //taxメソッドを作成(gakuは仮引数)gakuに1200が入る
double t = gaku * 0.05; //double型の変数tを宣言。1200円の消費税を計算してtに代入
return t; //計算結果のtをmainメソッドに返す・・・myTaxに代入される。
}
/*
* ここでmainメソッドに返されたtを戻り値という。
* 戻り値の方に制限はない
*
* 戻り値があるメソッドを作成するときの注意点
* public static "double" のように、戻り値の型を宣言する必要がある
* ここをvoidにすると、「何も値を返さない」と宣言していることになる。
*
* 値を返さないメソッドはvoidを指定する
* 値を返すメソッドは戻り値の型を指定する
*
*/

}

人気ブログランキング参加中です♪

ヨロシクオネガイシマス(ツ _ _)ツ))