AdapterView.OnItemClickListener & OnItemLongClickListener

Posted by muchag | Android | 2011-03-31 (木) 21:17:03

OnClickListenerOnLongClickListener は、View クラスであるが、
これらは、AdapterView クラス。

OnClickListener や OnLongClickListener は、View そのものをクリックしたときのイベント。
Button や TextView をクリック。

OnItemClickListener や OnItemLongClickListener は、View の中のアイテムをクリックしたときのイベント。
ListView の中の TextView をクリック。
 

OnItemClickListener

abstract void | onItemClick(AdapterView parent, View view, int position, long id)

Android Developers:OnItemClickListener

第1引数:クリックされた View の親 View
第2引数:クリックされた View
第3引数:リストにおけるクリックされた View の場所?
第4引数:クリックされた行番号。0 スタート
 

  1. import android.app.Activity;
  2. import android.widget.AdapterView;
  3. import android.widget.ListView;
  4.  
  5. public class OnItemClickListenerTest extends Activity implements AdapterView.OnItemClickListener {
  6.     @Override
  7.     public void onCreate(Bundle icicle) {
  8.         super.onCreate(icicle);
  9.  
  10.         ListView listView = new ListView(this);
  11.         listView setOnItemClickListener(this); //リスト項目をタップしたときのリスナー
  12.     }
  13.  
  14.     //ListView タップ処理
  15.     @Override
  16.     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  17.  
  18.         ListView listView = (ListView) parent;
  19.         String name = (String) listView.getItemAtPosition(position);
  20.  
  21.         // 処理
  22.     }
  23. }

 

OnItemLongClickListener

abstract boolean | onItemLongClick(AdapterView parent, View view, int position, long id)

Android Developers:OnItemLongClickListener

戻り値:bool 。不明。
第1引数:クリックされた View の親 View
第2引数:クリックされた View
第3引数:リストにおけるクリックされた View の場所?
第4引数:クリックされた行番号。0 スタート
 

  1. import android.app.Activity;
  2. import android.widget.AdapterView;
  3. import android.widget.ListView;
  4.  
  5. public class OnItemLongClickListenerTest extends Activity implements AdapterView.OnItemLongClickListener{
  6.     @Override
  7.     public void onCreate(Bundle icicle) {
  8.         super.onCreate(icicle);
  9.  
  10.         ListView listView = new ListView(this);
  11.         listView OnItemLongClickListener(this); //リスト項目をタップしたときのリスナー
  12.     }
  13.  
  14.     //ListView ロングタップ処理
  15.     @Override
  16.     public void onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
  17.  
  18.         ListView listView = (ListView) parent;
  19.         String name = (String) listView.getItemAtPosition(position);
  20.  
  21.         // 処理
  22.  
  23.         return false; /* ここが OnItemClickListener と異なる */
  24.     }
  25. }

戻り値はよくわからないので、ひとまず false にしてしまった・・・。

Android | 2011-03-31 (木) 21:17:03 |

ListView

Posted by muchag | Android,SQLite | 2011-03-31 (木) 1:20:06

ListView は、リストを表示する View。
まんまだ・・・。

コンテンツが多い場合は、自動的にスクロールバーが表示される。

Android Developers:ListView

表示の仕方は色々あるようだ。
 

準備

あれこれサイトを見て回ったが、現在のところ ListView を利用するためには
これを表示するための XML レイアウトファイルがどうしても必要みたい。
できれば、XML ファイルは触りたくなかったんだけどなぁ。

ただ、勘違いしないこと。
ListView はいつも通り、レイアウトファイルでも Java コードでもどちらでも配置できる。

main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ListView
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:id="@+id/list"
  5.     android:layout_width="fill_parent"
  6.     android:layout_height="wrap_content" />

としてもいいし

hoge.java
  1. ListView list = new ListView(this);
  2. layout.addView(list, new LinearLayout.LayoutParams(FP, WC));

としてもいい。

と思っていたら大変な記事を発見してしまった・・・。

まず,view.xmlという表示用のレイアウトを作成する。
上のリスト1にあるようにListViewのidは@android:id/listに決まっている。
データが存在しないときに,表示するTextViewのidも@android:id/emptyに決まっている。
そこまで決めなくてもよいように思うのだが,違うidにするとエラーになる。

ITpro:こうしろうのMindStorms日記 第325話 お約束が多くないか

そのうち試してみよう。

しかし、私が今まで触れてきた多言語フレームワークと違い
ListView の中身は別個定義しなければならない(定義できる)ので
中身用の XML レイアウトファイルが必要となる というわけだ。

中身とは何か。
リスト1行毎の表示内容という意味。

FlexitemRenderer のイメージ。

ごく基本的なリストは、テキストが並ぶものであろうから
この場合は、TextView を必要な数だけ配置する。

もっともシンプルな1列のリストなら、これで事足りる。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TextView
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:id="@+id/name"
  5.     android:layout_width="fill_parent"
  6.     android:layout_height="wrap_content" />

 
逆にテキストだけでなく、様々な View を利用したければ

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     android:orientation="horizontal"
  5.     android:layout_width="fill_parent"
  6.     android:layout_height="fill_parent">
  7.  
  8.     <ImageView
  9.         android:id="@+id/image"
  10.         android:layout_width="100"
  11.         android:layout_height="100"/>
  12.  
  13.     <CheckBox
  14.         android:id="@+id/check"
  15.         android:layout_width="wrap_content"
  16.         android:layout_height="wrap_content"
  17.         android:layout_toRightOf="@+id/image"/>
  18.  
  19.     <TextView
  20.         android:id="@+id/name"
  21.         android:layout_width="wrap_content"
  22.         android:layout_height="wrap_content"
  23.         android:layout_below="@id/check"
  24.         android:layout_toRightOf="@+id/image"/>
  25. </RelativeLayout>

このように、多種類の View を利用し、レイアウトも自由にできる
それぞれの View に書式設定を加えてやれば、見た目も自由にできる

以上のようなわけで XML ファイルの追加 のようにして

res/layout

に XML ファイルを作成する。

ファイル名は自由。
ここでは例として list_item.xml と命名したことにする。

作成すると自動的に以下のファイルに登録され、コード内で使えるようになる。

gen/パッケージ名/R.java
  1. /* AUTO-GENERATED FILE.  DO NOT MODIFY.
  2.  *
  3.  * This class was automatically generated by the
  4.  * aapt tool from the resource data it found.  It
  5.  * should not be modified by hand.
  6.  */
  7.  
  8. package com.example.hoge;
  9.  
  10. public final class R {
  11.  
  12.     ******
  13.  
  14.     public static final class layout {
  15.         public static final int list_item=0x7f030000; /* ←注目 */
  16.         public static final int main=0x7f030001;
  17.     }
  18.  
  19.     ******
  20. }

 

データバインド

準備が終わったらいよいよ ListView にデータをバインドする。
この方法が色々あるっぽいので、見つけて確認しながらまとめていく。
 

ArrayAdapter

文字通り配列を利用してデータバインド。
Android Developers:ArrayAdapter

res/layout/list_item.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TextView
  3.    xmlns:android="http://schemas.android.com/apk/res/android"
  4.    android:id="@+id/name"
  5.    android:layout_width="fill_parent"
  6.    android:layout_height="wrap_content"
  7. />

 

  1. //データ配列
  2. String[] data = {"中居", "木村", "稲垣", "草薙", "香取"};
  3.  
  4. //アダプタインスタンスを生成
  5. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, data);
  6.  
  7. ListView list = new ListView(this);
  8. list setAdapter(adapter);
  9. layout.addView(list, new LinearLayout.LayoutParams(FP, WC));

 
またこんな手法もあった。

  1. //アダプタインスタンスを生成
  2. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item);
  3. // アイテムを追加
  4. adapter.add("中居");
  5. adapter.add("木村");
  6. adapter.add("稲垣");
  7. adapter.add("草薙");
  8. adapter.add("香取");
  9.  
  10. ListView list = new ListView(this);
  11. list setAdapter(adapter);
  12. layout.addView(list, new LinearLayout.LayoutParams(FP, WC));

 
更に・・・下の SimpleCursorAdapter が上手くいかないので
DB からの取得結果を配列に入れて ArrayAdapter にてバインドする手法も成功した。

  1. //既存データの読み込み
  2. Cursor cursor = db.query(DB_TABLE, new String[]{"name"}, null, null, null, null, null);
  3. if (cursor.getCount() != 0) {
  4.  
  5.     //アダプタインスタンスを生成
  6.     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item);
  7.  
  8.     boolean isEof = cursor.moveToFirst();
  9.     while (isEof) {
  10.         adapter.add(cursor.getString(1));
  11.         isEof = cursor.moveToNext();
  12.     }
  13. }
  14.  
  15. ListView list = new ListView(this);
  16. list setAdapter(adapter);
  17. layout.addView(list, new LinearLayout.LayoutParams(FP, WC));

 

SimpleCursorAdapter

Android Developers:SimpleCursorAdapter

SimpleCursorAdapter を利用した手法はどうも上手くいかない。

よそ様のサイトにあるサンプルを動かすとちゃんと動くのだが
自作のは動かない・・・。

後々のためにいくつかメモ。

多くのサンプルが main.xml と list.xml を用いているが
自作品はできるだけ XML レイアウトファイルを使いたくないため list.xml のみ。
今のところ見つけられたサンプルは、こちらのみ。
愚鈍人:SQLiteでデータベース

こちらの真ん中辺りにある
CursorAdapterを使ってSQLiteの検索結果をListViewに表示する。

ListView は java で定義し、中身の TextView のみ XML レイアウトファイルを利用。
上記サンプルは正常に稼動。

サンプルと自作品の気になる相違点

  • サンプルはデータベース名がない
    → サンプルのデータベース名を設定するように変更しても無事稼動
  • サンプルのカラムは name, age のみで _id がない
    SQL 文内で rowid as _id としている
    自作品は _id, name, col1, col2, col3
  • データ取得が、サンプルは rawQuery、自作品は query
    自作品を rawQuery で試しても変化なし

注意点
ID カラムの名称を _id にしなけらばならない。 らしいがこれはしてある。

いつか解決しますように!

Android,SQLite | 2011-03-31 (木) 1:20:06 |

SQLite -> テーブル操作

Posted by muchag | Android | 2011-03-30 (水) 15:29:47

作成

SQLite -> 接続 から処理部分を抜粋して。
ID カラムのお約束 を参考に。

  1. //データベースオブジェクト の生成
  2. DBHelper dbHelper = new DBHelper(this);
  3. db = dbHelper.getWritableDatabase();
  4.  
  5. //テーブル の生成
  6. db.execSQL(
  7.         "create table if not exists "
  8.             + DB_TABLE
  9.                 + "("
  10.                 + "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
  11.                 + "name TEXT"
  12.                 + ")"
  13.             );
  14.  
  15. //*** 処理 ***
  16.  
  17. //データベースオブジェクト の開放
  18. db.close();

 

取得
query
  1. Cursor cursor = db.query(DB_TABLE, new String[]{"_id", "name"}, "_id=0", null, null, null, null);

Cursor | query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

Android Developers:SQLiteDatabase query
Android Developers:Cursor

ん~、サンプルとリファレンスで引数の数が合わない・・ 🙄

ひとまずサンプルに合わせてメモ。
戻り値:Cursor オブジェクト
第1引数:不明
第2引数:テーブル名
第3引数:対象フィールド名配列。指定しない場合は null
第4引数:WHERE句。指定しない場合は null
第5引数:不明
第6引数:不明
第7引数:不明
第8引数:ソート順。指定しない場合は null
第9引数:抽出数。指定しない場合は null
 

rawQuery

Cursor | rawQuery (String sql, String[] selectionArgs)

Android Developers:SQLiteDatabase rawQuery

 

追加
insert
  1. //書き込み用データオブジェクトの生成
  2. ContentValues values = new ContentValues();
  3. values.put("name", name);
  4.  
  5. db.insert(DB_TABLE, null, values);

long | insert(String table, String nullColumnHack, ContentValues values)

Android Developers:SQLiteDatabase insert

戻り値:挿入したレコードの _id 。エラー時は -1 。
第1引数:テーブル名
第2引数:不明
第3引数:書き込み用データオブジェクト
Android Developers:ContentValues
 

更新
update
  1. //書き込み用データオブジェクトの生成
  2. ContentValues values = new ContentValues();
  3. values.put("_id", id);
  4. values.put("name", name);
  5.  
  6. //ここで利用している変数 id は int(整数型)なので、
  7. //WHERE 句用データ(第4引数)は、SQL 用に String(文字列型)へ変換する必要がある
  8. db.update(DB_TABLE, values, "_id = ?", new String[]{String.valueOf(id)});

int | update (String table, ContentValues values, String whereClause, String[] whereArgs)

Android Developers:SQLiteDatabase update

戻り値:更新された行数
第1引数:テーブル名
第2引数:書き込み用データオブジェクト
第3引数:WHERE 句(プリコンパイルタイプ。プレースフォルダを利用)
第4引数:WHERE 句用データ

Android Developers:ContentValues

Android | 2011-03-30 (水) 15:29:47 |

SQLite -> 接続

Posted by muchag | Android | 2011-03-30 (水) 14:03:49

様々な手法があるようだが、現在利用している手法を。

Android にて SQLite を利用するためには
SQLiteOpenHelper クラスを継承したヘルパーを実装する必要がある。
Android Developers:SQLiteOpenHelper
 

  1. import android.content.Context;
  2. import android.database.sqlite.SQLiteDatabase;
  3. import android.database.sqlite.SQLiteOpenHelper;
  4.  
  5. public class DatabaseTest extends Activity {
  6.  
  7.     private final static String DB_NAME = "hoge.db";//DB名
  8.     private final static String DB_TABLE = "koge";   //テーブル名
  9.     private final static int    DB_VERSION = 1;      //バージョン
  10.     private SQLiteDatabase db;      //データベースオブジェクト
  11.    
  12.     @Override
  13.     public void onCreate(Bundle savedInstanceState) {
  14.         super.onCreate(savedInstanceState);
  15.  
  16.         //データベースオブジェクト の生成
  17.         DBHelper dbHelper = new DBHelper(this);
  18.         db = dbHelper.getWritableDatabase();
  19.  
  20.         //*** 処理 ***
  21.  
  22.         //データベースオブジェクト の開放
  23.         db.close();
  24.     }
  25.  
  26.     //データベースヘルパーの定義
  27.     private static class DBHelper extends SQLiteOpenHelper {
  28.         //データベースヘルパーのコンストラクタ
  29.         public DBHelper(Context context) {
  30.             super(context, DB_NAME, null, DB_VERSION);
  31.         }
  32.        
  33.         //データベースの生成
  34.         @Override
  35.         public void onCreate(SQLiteDatabase db) {
  36.             db.execSQL(
  37.                     "create table if not exists "
  38.                         + DB_TABLE
  39.                             + "("
  40.                             + "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
  41.                             + "name TEXT"
  42.                             + ")"
  43.                         );
  44.  
  45.         }
  46.  
  47.         //データベースのアップグレード
  48.         @Override
  49.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  50.             db.execSQL("drop table if exists " + DB_TABLE);
  51.             onCreate(db);
  52.         }
  53.     }
  54. }

 

データベースヘルパー
コンストラクタ
  1. public DBHelper(Context context) {
  2.     super(context, DB_NAME, null, DB_VERSION);
  3. }

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
Android Developers:SQLiteOpenHelper

第1引数:Context ・・・これが曲者・・・。調べてみたけどやっぱりよくわからない。
慣れてくれば少しはわかると思うので、しばし放置。
さりながら疑問点をメモ。
Activity クラス直下(Activity クラス内)で this 用いれば当該アクティビティを取得してくれるらしいのだが
あれこれサイトを見ると、getApplicationContext() というメソッドを使うとよい、と書いてある。
違いはそのうちわかる・・・はず。
第2引数:データベース名
第3引数:SQLiteDatabase.CursorFactory ・・・意味不明
第4引数:データベースヴァージョン ・・・自ら決めてよいらしい
 

onCreate

データベースを新規生成する際に呼ばれる。
一生に1回だけ・・・かな?

多くのサンプルが、このメソッドの中にテーブル作成のコードを入れているが
どうもピンとこない。
確かにデータベース生成時に最低限のテーブルは必要なんだろうけど
「データベースの生成」と「テーブルの生成」は・・・
何ていうのかな、タイミングが違う気がして直感でわかり辛い。
 

onUpgrade

データベースのアップグレード時(ヴァージョンを変更した時)に呼ばれる。

まだ試していないので、そのうち書き換える。

Android | 2011-03-30 (水) 14:03:49 |

罠チェックリスト

Posted by muchag | Android | 2011-03-30 (水) 12:25:00

まだ慣れていないせいもあるが
相変わらずの私のボケのせいで
つまらないことで躓く・・・。 😥

そういうわけで、二度と繰り返さないために
つまらない罠チェックリスト!

  • アクティビティを追加した際、AndroidManifest.xml への登録をした?
  • LinearLayout で orientation を設定した?
  • パーツを配置するとき width, height の設定をした?
  • Cursor cursor = db.query の後、cursor.moveToFirst(); した?
Android | 2011-03-30 (水) 12:25:00 |

XML ファイルの追加

Posted by muchag | Android | 2011-03-30 (水) 2:10:49

[ファイル]-[新規]-[その他]
で、ウィザードが起動。

 
[Android]-[Android XML File]
を選択して次へ。

 
プロジェクト名とファイル名を入力。

ウィザード開始前に
パッケージエクスプローラで
当該プロジェクト内の何かを選択しておけば
プロジェクト名は自動入力してくれる。

 
次にリソースタイプを選択。
「レイアウト」「値」以外は、現在のところ意味不明。

ウィザード開始前に、パッケージエクスプローラで
当該プロジェクト内の res フォルダ内以外を選択しておけば
ダイアログ下部のフォルダ名は自動入力してくれる。

または、layout , values いずれかの中のファイルを選択しておいても
自動で入力してくれる。

 
とここまで書いたけど、実は
ファイルを追加したいフォルダを右クリックして
コンテキストメニューから
[新規]-[その他のファイル]
が一番楽でした・・・。

Android | 2011-03-30 (水) 2:10:49 |

PhoneGap

Posted by muchag | Android,Language | 2011-03-29 (火) 18:04:16

PhoneGap なんていうものを見つけた。

HTML5 を利用してアプリを開発するフレームワークらしい。

API の利用ができるようだ。

HTML, CSS, JavaScript を用いて記述し
Apple iOS, Google Android, Palm, Symbian, Blackberry 等に対応しているようだ。

Android,Language | 2011-03-29 (火) 18:04:16 |

SL4A (Scripting Layer for Android)

Posted by muchag | Android | 2011-03-29 (火) 12:52:50

SL4A なんていうものを見つけた。
まだまだ発展途上どころか開発途上くらいみたいだけど
面白そう♪

ただ、普通のスマートフォンだと入力が大変そうだ・・・。

Google Project Hosting:android-scripting

SL4A (Scripting Layer for Android) とは

Android 上でスクリプト言語を編集したり実行したりできるもの。

2011-03-29 現在、Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl, and shell がサポートされている。

Android | 2011-03-29 (火) 12:52:50 |

AlertDialog & AlertDialog.Builder

Posted by muchag | Android | 2011-03-29 (火) 1:22:42

AlertDialog & AlertDialog.Builder
モーダレス なメッセージダイアログ。

差異

AlertDialog はインスタンスの生成ができないらしい。

参考サイト:無題のAndroid入門中 AlertDialog  AlertDialog.Builderの違い

現在私があれこれ見ただけの段階でのイメージは

AlertDialog

一般的なダイアログクラス。
 

AlertDialog.Builder

Builder っていうくらいなわけでダイアログ生成のための
お助けクラス?

冗長になりがちな AlertDialog のコードを
詳細且つより論理的に記述できるもの。
 

AlertDialog

Android Developers:AlertDialog

  1. AlertDialog.show(引数);

とするようなのだが、上の公式リファレンスを見ても
show というメソッドはどこにもない。
まだまだ見方がよくわからない・・・。 🙄
 

基本セット
  1. AlertDialog.show([context], [title], [message]);
  2.  
  3. // サンプル
  4. AlertDialog.show([this, "あいさつ", "おはよう");
[context]

ベースとなる Context (ダイアログの親)。
アクティビティ直下なら this
アクティビティ内のクラス内なら アクティビティ名.this 。
っぽい。
 

[title]

ダイアログに冠するタイトル。
 

[message]

ダイアログに表示するメッセージ。
 
んで、いっぱい機能を利用しようとするとガンガン増えていく。
 

満載セット
  1. AlertDialog.show([context], [title], [message],
  2.                 [view],
  3.                 [button1Text], [button1Listener],
  4.                 [button2Text], [button2Listener],
  5.                 [button3Text], [button3Listener],
  6.                 [cancelable], [cancelListener]
  7. );
  8.  
  9. // サンプル
  10. AlertDialog.show([this, "あいさつ", "おはよう"
  11.                 ビュー名,
  12.                 "OK", リスナー名,
  13.                 "Cancel", リスナー名,
  14.                 "ビューがあるときは3番目のボタンはないかな?", リスナー名,
  15.                 true, リスナー名
  16. );

 

[view]

ダイアログに表示させたいビューのインスタンス。
必要がなければ書かなければよい。
 

[buttonText], [buttonListener]

[buttonText] – ボタンに表示させたい文字列。
[buttonListener] – ボタンがクリックされたときに使用するリスナーを指定。

必要な個数分だけ書けばよい。
3個まで?
 

[cancelable], [cancelListener]

携帯なら Back(戻る)キー
PC なら ESC(エスケープ)キー
を有効にするか否か。
有効なときはそのリスナーを指定。
無効なときはリスナーは null 。
false, null

<参考サイト>
JavaDrive:AlertDialogクラス
AllAbout For M Java プログラミング:androidのダイアログを使いこなそう!
 

AlertDialog.Builder

Android Developers:AlertDialog.Builder
まだまだ記事を書くほどわからないし
素晴らしいサイトがいくつもあるので
ひとまずは、参考サイトの列挙まで。

<参考サイト>
八角研究所:Android で再開する Java プログラミング(14) – ダイアログを制するものがAndroidを制する!
yan note:Android AlertDialogを表示する
 

注意

どこで読んだのか忘れてしまったので
うる覚えでメモ。

AlertDialog の OnClickListener および OnCancelListener
View のものとは異なり、DialogInterface のものなので衝突が起きる。
Flex のとき(Flash Builder 4 -> 並存コンポーネントのクラッシュ)にあったやつだ。

そこでパッケージ名からちゃんと記述してやるとよい。
android.content.DialogInterface.OnClickListener ・・・だったかしら・・・。
その内ちゃんと書き直す・・・だろう・・・書き直せ! 私! 👿

Android | 2011-03-29 (火) 1:22:42 |

エミュレータ -> 日本語入力

Posted by muchag | Android | 2011-03-27 (日) 13:57:30

エミュレータに日本語入力を設定。

エミュレータ -> 日本語表記 にて日本語表記に変更済み。

【環境】
android-sdk_r08-windows
Android DDMS 8.0.1.v201012062107-82219
Android 開発ツール 8.0.1.v201012062107-82219
Android Hierarchy Viewer 8.0.1.v201012062107-82219

 

 

 

 

 

 

Shimeji の導入

Android アプリをエミュレータへインストールする手法は2種類ある。

  1. エミュレータで .apk ファイルを DL し、インストール
  2. PC に .apk ファイルを保存し、adb (Android Debug Bridge)よりインストール

今回は1の手法。
 

エミュレータで DL し、インストール
DL

 
検索キーワードに
throw life shimeji
と入力して、検索。

 

 
Shimeji の作者様のサイト♪

ありがとうございます。
大感謝!

下へ移動していくと・・・

 
「野良Shimeji」というタイトルが素敵♪

ありがたく DL させていただきます。

 

インストール

DL 終了メッセージをクリック。

 

 

 

有効化

JapaneseIME のチェックをはずし
Shimeji にチェックをつける。

と・・・

 
こんな恐ろしい警告が 🙄

危険性がよくわからないし
今はエミュレータなので
ひとまずOKに。

 

実演

おおお
見事にシメジの花びらが♪

Android | 2011-03-27 (日) 13:57:30 |
次ページへ »