プロジェクト -> インポート

Posted by muchag | Android | 2011-04-26 (火) 14:16:45

既存のプロジェクトを
Eclipse へインポートする手法。

[ファイル]-[インポート] から

 
「既存のプロジェクトをワークスペースへ」を選択して
次へ。

 
プロジェクトフォルダが存在する場合は
「ルート・ディレクトリーの選択」->「参照」

プロジェクトの圧縮ファイル(.zip)が存在する場合は
「アーカイブ・ファイルの選択」->「参照」

で、当該ディレクトリなりファイルを指定する。

 
「ルート・ディレクトリーの選択」の場合、指定するフォルダは
「.project」ファイルがあるフォルダ、とも
「AndroidManifest.xml」があるフォルダ、とも書かれているが
Android の場合は結果的には同じことのようだ。

ただ、Eclipse の使い方で考えたら
「.project」ファイルがあるフォルダ、が正しい気がする。

 
というようりも、そもそもディレクトリを指定すると
それ以下のプロジェクトを全部拾ってくれる仕組みになっている。

複数ある場合は、必要なものだけをチェックすればよいわけで
あまり深く考える必要はなさそうだ。

Android | 2011-04-26 (火) 14:16:45 |

指定の位置に画像を配置 その2

Posted by muchag | Android | 2011-04-25 (月) 17:41:15

指定の位置に画像を配置
MapView の指定位置に画像を配置する手法を学習したが
別の手法も存在するようだ。

というのも、前の手法では、配置する画像が指定位置の右下に来ていたため
指定位置を中央とする手法を探していて発見した。

Android Developers:Google Map View Part 2: Adding Overlay Items

まず、ItemizedOverlay クラスを継承したサブクラスを作成する。

HelloItemizedOverlay.java
クラスファイルの作成

新しいクラスファイルを作成する際のダイアログで
① クラスファイル名(任意)入力
② スーパークラス入力
com.google.android.maps.ItemizedOverlay
③ 「スーパークラスからのコンストラクター」にチェック

 
とすると

  1. package com.example.sample;
  2.  
  3. import android.graphics.drawable.Drawable;
  4.  
  5. import com.google.android.maps.ItemizedOverlay;
  6. import com.google.android.maps.OverlayItem;
  7.  
  8. public class HelloItemizedOverlay extends ItemizedOverlay {
  9.  
  10.     public HelloItemizedOverlay(Drawable defaultMarker) {
  11.         super(defaultMarker);
  12.         // TODO 自動生成されたコンストラクター・スタブ
  13.     }
  14.  
  15.     @Override
  16.     protected OverlayItem createItem(int i) {
  17.         // TODO 自動生成されたメソッド・スタブ
  18.         return null;
  19.     }
  20.  
  21.     @Override
  22.     public int size() {
  23.         // TODO 自動生成されたメソッド・スタブ
  24.         return 0;
  25.     }
  26.  
  27. }

というクラスファイルが自動生成される。

自動生成の割には

ItemizedOverlay は raw 型です。総称型 ItemizedOverlay への参照は、パラメーター化する必要があります Java 問題

こんな警告が出てる。。。意味がわからない。。。後回し。。。
 

Overlay Item 格納コレクション

クラスのフィールドエリアに、Overlay Item を格納するための ArrayList コレクションを定義。

  1. private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

 

Drawable 描画準備

Drawable リソースが描画されるために、メソッドを1つかます必要がある。

  1. public HelloItemizedOverlay(Drawable defaultMarker) {
  2.     super( boundCenterBottom(defaultMarker) );
  3.     populate(); // Android のバグ回避用
  4. }

これをかましていないと LogCat に以下のようなエラーが出て、マーカーが表示されない。
ERROR/MapActivity(226): Couldn’t get connection factory client
(かまさない時だけこのエラーが出るので、そうだと思う)
 

boundCenter

指定 GeoPoint が Drawable の中心にくるように指定。
 

boundCenterBottom

指定 GeoPoint が Drawable の下辺中央にくるように指定。
 

Android のバグ

また、Android にバグがあるため、バグ回避用に populate メソッドも追加。
参考元サイト:とあるSEのリマインダー
MapViewでItemizedOverlayでアイテムが設定されていないとNullpointer Exceptionが発生
 

Overlay Item 追加メソッド

Overlay Item を追加するためのメソッドを追加。

  1. public void addOverlay(OverlayItem overlay) {
  2.     mOverlays.add(overlay);
  3.     populate();
  4. }

 

createItem メソッドと size メソッドのオーバーライド

自動生成された createItem メソッドと size メソッドを以下のように変更。

  1. @Override
  2. protected OverlayItem createItem(int i) {
  3.     return mOverlays.get(i);
  4. }
  5.  
  6. @Override
  7. public int size() {
  8.     return mOverlays.size();
  9. }

 

タップイベントを拾うための準備

タップイベントを拾うために、コンストラクタに Context の参照を追加。

  1. private Context mContext;
  2.  
  3. public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
  4.     super( boundCenterBottom(defaultMarker) );
  5.     mContext = context;
  6.     populate(); // Android のバグ回避用
  7. }

 

タップイベント処理
  1. @Override
  2. protected boolean onTap(int index) {
  3.     OverlayItem item = mOverlays.get(index);
  4.     AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  5.     dialog.setTitle(item.getTitle());
  6.     dialog.setMessage(item.getSnippet())
  7.     dialog.show();
  8.     return true;
  9. }

 

HelloGoogleMaps.java

ここで元になる MapActivity (ここでは、HelloGoogleMaps とする)クラスへ戻る。
 

アイコンの準備

MapView 上に Overlay Item として表示する画像を準備する。
上記 Android Developers サイトにロボットの画像があり、
「持ってなかったら、これを使っていいよ」と書いてある。

 
そして、「何なら自分のプロジェクトのリソースフォルダに D&D するといいよ」とも書いてある。
試しにやってみると、左のようなダイアログが出て、ちゃんと保存できた。
が、3jxz5leh.bmp というファイル名になった。
元々は androidmarker.png というファイル名。

ビットマップファイルに自動で変換してくれた、っていうことかしら。

 

onCreate メソッドに追加
  1. List<Overlay> mapOverlays = mapView.getOverlays();
  2. Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
  3. HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

 

マーカー配置例

いよいよ具体的にマーカーを配置する手法。
onCreate メソッドに更に追加

  1. GeoPoint point = new GeoPoint(19240000,-99120000);
  2. OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");

マーカーを表示したい位置で GeoPoint インスタンスを生成し
それを、タイトルやメッセージと共に Overlay Item インスタンスへ渡す。
 
onCreate メソッドに更に追加

  1. itemizedoverlay.addOverlay(overlayitem);
  2. mapOverlays.add(itemizedoverlay);

最後に、今作った Overlay Item インスタンスを HelloItemizedOverlay インスタンスへ追加し
その HelloItemizedOverlay インスタンスを MapView の Overlay コレクションへ追加する。
 

完成例

 

HelloItemizedOverlay.java
  1. package com.example.sample;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import android.app.AlertDialog;
  6. import android.content.Context;
  7. import android.graphics.drawable.Drawable;
  8.  
  9. import com.google.android.maps.ItemizedOverlay;
  10. import com.google.android.maps.OverlayItem;
  11.  
  12. public class HelloItemizedOverlay extends ItemizedOverlay {
  13.  
  14.     private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
  15.     private Context mContext;
  16.  
  17.     public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
  18.         super( boundCenterBottom(defaultMarker) );
  19.         mContext = context;
  20.         populate(); // Android のバグ回避用
  21.     }
  22.  
  23.     @Override
  24.     protected OverlayItem createItem(int i) {
  25.  
  26.         return mOverlays.get(i);
  27.     }
  28.  
  29.     @Override
  30.     public int size() {
  31.  
  32.         return mOverlays.size();
  33.     }
  34.  
  35.     public void addOverlay(OverlayItem overlay) {
  36.  
  37.         mOverlays.add(overlay);
  38.         populate();
  39.     }
  40.  
  41.     @Override
  42.     protected boolean onTap(int index) {
  43.  
  44.         OverlayItem item = mOverlays.get(index);
  45.         AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  46.         dialog.setTitle(item.getTitle());
  47.         dialog.setMessage(item.getSnippet());
  48.         dialog.show();
  49.  
  50.         return true;
  51.     }
  52. }

 

HelloGoogleMaps.java
  1. package com.example.sample;
  2.  
  3. import java.util.List;
  4.  
  5. import android.graphics.drawable.Drawable;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.Window;
  9.  
  10. import com.google.android.maps.GeoPoint;
  11. import com.google.android.maps.MapActivity;
  12. import com.google.android.maps.MapView;
  13. import com.google.android.maps.Overlay;
  14. import com.google.android.maps.OverlayItem;
  15.  
  16. public class HospitalMap2 extends MapActivity {
  17.  
  18.     private MapView mapView; // MapView
  19.  
  20.     @Override
  21.     public void onCreate(Bundle savedInstanceState) {
  22.  
  23.         super.onCreate(savedInstanceState);
  24.         requestWindowFeature(Window.FEATURE_NO_TITLE);
  25.  
  26.         // MapView のインスタンスを生成
  27.         mapView = new MapView(this, getResources().getString(R.string.map_key));
  28.         mapView.setEnabled(true);
  29.         mapView.setClickable(true);
  30.         mapView.setBuiltInZoomControls(true); // ズームボタンを有効
  31.         mapView.getController().setZoom(11); // ズーム度の初期値を設定
  32.         setContentView(mapView);
  33.  
  34.         List<Overlay> mapOverlays = mapView.getOverlays();
  35.         Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
  36.         HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
  37.  
  38.         GeoPoint point = new GeoPoint(19240000, -99120000);
  39.         OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
  40.  
  41.         itemizedoverlay.addOverlay(overlayitem);
  42.         mapOverlays.add(itemizedoverlay);
  43.     }
  44.  
  45.     @Override
  46.     protected boolean isRouteDisplayed() {
  47.         return false;
  48.     }
  49. }
Android | 2011-04-25 (月) 17:41:15 |

繰り返し処理

Posted by muchag | Android | 2011-04-24 (日) 19:41:17

 

  1. // データの読み込み
  2. Cursor cursor = db.query("sample", null, null, null, null, null, null);
  3. if (cursor.getCount() != 0) {
  4.  
  5.     boolean isEof = cursor.moveToFirst();
  6.     while (isEof) {
  7.        
  8.         String name = cursor.getString( cursor.getColumnIndex("name") );
  9.  
  10.         isEof = cursor.moveToNext();
  11.     }
  12. }
  13.  
  14. // Cursor の開放
  15. cursor.close();
Android | 2011-04-24 (日) 19:41:17 |

Devices ビュー

Posted by muchag | Android | 2011-04-24 (日) 14:12:59

DDMS パースペクティブに標準装備。








スクリーンショット



 

⑧ スクリーンショット

エミュレータの画面のスクリーンショット関連。
[リフレッシュ] 再読み込み
[rotate] 画像を反時計回りに 90° 回転してくれる
[保管] スクリーンショットを名前を付けて保存
[コピー] スクリーンショットをクリップボードへコピー
[終了] ダイアログを閉じる

Android | 2011-04-24 (日) 14:12:59 |

エミュレータに緯度・経度を設定

Posted by muchag | Android | 2011-04-24 (日) 3:12:07

エミュレータに任意の場所の緯度・経度を設定することができる。

DDMS パースペクティブにはデフォルトで配置されている
Emulator Control ビュー。

これの [Location Controls]-[手操作] で
緯度・経度を設定できる。

「送信」でエミュレータに設定。

エミュレート中に変更可能。

Android | 2011-04-24 (日) 3:12:07 |

ビルド・ターゲットの変更

Posted by muchag | Android | 2011-04-23 (土) 12:40:41

新しいプロジェクトを作成するときに「ビルド・ターゲット」を設定する。
新規プロジェクトの立ち上げ

これをプロジェクト作成後に変更する手法。

[プロジェクト]-[プロパティー] か
プロジェクト名を右クリックで
[プロパティー] を選択。

 
左ペインで [Android] を選択すると
ビルド・ターゲット一覧が出てくるので
ここで希望するターゲットにチェックを付けて
OK すれば完了。

Android | 2011-04-23 (土) 12:40:41 |

AVD -> ターゲットの追加

Posted by muchag | Android | 2011-04-22 (金) 20:56:29

AVD には、ターゲットを追加できる。

端末個別にエミュレーションしたい場合に有効。

罠?w

[ウインドウ]-[Android SDK および AVD マネージャー] より
AVD マネージャを起動できるが、
どうやら今回の場合、これは罠のようだ・・・。

というのも、後々「failed to install」なんて言われる。

 
SS を撮ってあったはずなのに、見つからない。 😥

サイトを見回ると、SDK のインストール時に同じようなダイアログが出ることがあるらしく
これは、アンチウイルスソフトが原因のようだ。

しかし、今回は違う。
メッセージ内容で覚えているのは
「インストール先フォルダが使用中なので、インストールできないよ。
フォルダを使用しているアプリケーションを全部終了したらOKしてね」
みたいだった。

でもね・・・動いているのはブラウザと Eclipse のみ。
まぁ、そりゃ Eclipse は使っているだろうけどさ。
これを終了したら、ターゲットの追加ができないでしょ・・・。

と思っていたら、
実は、AVD マネージャを起動するのに別の手法があった。

Android\android-sdk-windows\tools\android.bat

このファイルから AVD マネージャを起動することができた。

つまり、やっぱり Eclipse も閉じないといけなかったらしい。
 

ターゲットの追加

そういうわけで、ここからが本番。

 
① 左ペインの「Available packages」を選択。

② ダイアログ下部の「Add Add-on Site…」をクリック。

 
出てきたダイアログに当該ターゲットの repository.xml ファイル配布元 URL を記入。

左図では、Xperia arc の repository.xml ファイルへの URL 。

OK をクリックすると、

 
もとの画面に戻る。

ここで、中央ペインに「User Add-ons」が追加されているので展開すると
期待していたものが出てくるはず。
① それにチェックをつける。

② 右下の「Install Selected」をクリック。

 
① 左ペインにある当該ターゲットを選択。

② 真ん中下辺りにあるラジオボタンで「Accept」を選択。

③ 「Install」をクリック。

 
一通り作業が終わったら「Close」をクリック。

 
マネージャで左ペインで「Virtual devices」が選択されていることを確認して
「New」をクリックする。

そうすると左図ダイアログが出るので
「Target」のところのドロップダウンメニューを広げると
目的のターゲットが追加されていることがわかる。

 

repository.xml ファイル配布元
Sony Ericsson
Xperia arc

http://developer.sonyericsson.com/edk/android/repository.xml
 
参考元サイト:とあるソニー好きなエンジニアの日記 Xperia arcの開発を始めてみよう

Android | 2011-04-22 (金) 20:56:29 |

Xpreria arc (実機) でデバッグ

Posted by muchag | Android | 2011-04-21 (木) 0:42:58

実記デバッグを試みようとして苦労したこと・・・。

初めての Android 端末なので、トンチンカンな話が多いかも。

USB ドライバのインストール

USB ケーブルで PC に接続して
PC に端末を認識させる作業。

一般的な端末なら

android-sdk-windows/google-usb_driver/

(SDK r08)
この辺りからいけるらしいのだが
Xperia は先代の時から、勝手な振る舞いらしく
端末から直インストールなのだそうだ。

ところが、どうにもならずに困った。

最終的にはインストールできたので、
一応最初から順に。
 

端末の設定

いつもの [設定] から

 
[アプリケーション] に入る。

 
まず [提供元不明のアプリ] にチェックをつける。
あ、これはアプリデバッグ用の設定なので
アプリ作成と関係がない場合はいらないと思う。

次に [開発] に入る。

 
[USB デバッグ] にチェックをつけたら2つ戻る。
これもアプリデバッグ用設定。

 
[Sony Ericsson] に入る。

 
[接続] に入る。

 
[USB 接続モード] をクリックする。

 
と、左のようなダイアログが出るので
[ファイル転送モード(MSC)] を選択する。

あちこちのサイトで、[メディア転送モード(MTP)] でも
USB ドライバのインストールができるようなことが書いてあるが
私は、ここで [ファイル転送モード(MSC)] に変更することで
インストールできた。

 

PC と端末の連携

端末を PC に USB コードでつなぐと
PC Companion のインストールを促すダイアログが出るので
インストールすると、USB ドライバも自動的にインストールされる。

という情報があったが、私は [ファイル転送モード(MSC)] にするまで
ドライバがインストールされなかった。

ドライバが無事にインストールされると
左の図のように、デバイスマネージャに
「Sony Ericsson sa0102 ADB Interface Driver」
と表示される。

 
[メディア転送モード(MTP)] にしている間は MTP Device と表示されていた
エクスプローラでの表示も、左のように、いち外付けメディアとして
リムーバブルディスク と表示されるようになった。

 
そして!
他のサイトで紹介されていたこの画面に
ようやく辿り着けた。

画面の指示に従って操作を続けると・・・

 
Xperia arc (SO-01C) へ接続済み の文字が!
ここまで長かった。

 

実機でデバッグ

ここでもちょいとトラブル。

エミュレータの起動(デバッグ)
ここのように [デバッグの構成]-[ターゲット] で「手操作」と設定していると
デバッグ時に、次のような「Android Device Chooser」というダイアログが表示される。
左図は成功後の SS なのでちゃんと実機が表示されているが
最初は表示されていなかった。

再現性を確かめていないので、何が原因か確かなことは言えないが
どうもエミュレータを起動中だったのが原因らしい。

エミュレータを終了後に「Android Device Chooser」表示させたら
ちゃんと実機も表示された。

Android | 2011-04-21 (木) 0:42:58 |

1つ目のテキストの位置がずれる

Posted by muchag | Android,困ったTT | 2011-04-18 (月) 15:22:27

またまたわけのわからない現象が・・・。 🙄

RadioButton & RadioGroup
スクリプトでラジオボタンを配置しようとサンプルを作っていたら
1つ目のラジオボタンだけテキストの位置がずれる。

 
順番を入れ替えても
やはり1つ目のテキストの位置がずれる。

 

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

 

Acha.java
  1. package com.example.sample;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.ViewGroup;
  6. import android.widget.LinearLayout;
  7. import android.widget.RadioButton;
  8. import android.widget.RadioGroup;
  9.  
  10. public class Acha extends Activity {
  11.     /** Called when the activity is first created. */
  12.     @Override
  13.     public void onCreate(Bundle savedInstanceState) {
  14.         super.onCreate(savedInstanceState);
  15.         setContentView(R.layout.main);
  16.        
  17.         LinearLayout llMain = (LinearLayout) findViewById(R.id.llMain);
  18.        
  19.         RadioGroup rg = new RadioGroup(this);
  20.         llMain.addView(rg, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) );
  21.        
  22.         RadioButton rbA = new RadioButton(this);
  23.         rbA.setText("A");
  24.         rg.addView(rbA);
  25.        
  26.         RadioButton rbB = new RadioButton(this);
  27.         rbB.setText("B");
  28.         rg.addView(rbB);
  29.        
  30.     }
  31. }

グーグル先生におうかがいを立てても
上手くヒットしない。

たまにエミュレータの画面のサイズ?解像度?が
突然変わることがあると、エミュレータの再起動で直るんだけど
再起動しても直らない。

何事?

Android,困ったTT | 2011-04-18 (月) 15:22:27 |

RadioButton & RadioGroup

Posted by muchag | Android | 2011-04-18 (月) 13:34:36

毎度お馴染みの UI である RadioButton

HTML のように name 属性にてグループを構成するのではなくて
RadioGroup クラスにて設定する。

Android Developers:RadioButton & RadioGroup

レイアウト
XML
  1. <RadioGroup
  2.     android:id="@+id/radiogroup"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="wrap_content">
  5.  
  6.     <RadioButton
  7.         android:id="@+id/radiobuttonA"
  8.         android:text="A"
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content" />
  11.  
  12.     <RadioButton
  13.         android:id="@+id/radiobuttonB"
  14.         android:text="B"
  15.         android:layout_width="wrap_content"
  16.         android:layout_height="wrap_content" />
  17.  
  18.     <RadioButton
  19.         android:id="@+id/radiobuttonC"
  20.         android:text="C"
  21.         android:layout_width="wrap_content"
  22.         android:layout_height="wrap_content" />
  23. </RadioGroup>

 

スクリプト
  1. LinearLayout llMain = (LinearLayout) findViewById(R.id.llMain);
  2.  
  3. RadioGroup rg = new RadioGroup(this);
  4. llMain.addView(rg, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) );
  5.  
  6. RadioButton rbA = new RadioButton(this);
  7. rbA.setText("A");
  8. rg.addView(rbA);
  9.  
  10. RadioButton rbB = new RadioButton(this);
  11. rbB.setText("B");
  12. rg.addView(rbB);
  13.  
  14. RadioButton rbC = new RadioButton(this);
  15. rbB.setText("C");
  16. rg.addView(rbC);

8,12,16行目の addView は、4行目の addView とは異なり
RadioGroup 特有のもの。

void | addView (View child, int index, ViewGroup.LayoutParams params)

Android Developers:RadioGroup addView

第1引数:ラジオボタンのインスタンス
第2引数:ラジオボタンのポジション。省略可。記述する場合は 0 から順にしないとエラーになる
第3引数:LayoutParams。省略可

とひとまず動くには動いたけど
1つ目のテキストの位置がずれる
こんな問題を抱える羽目に。
 

注意点

RadioButton は RadioGroup の直下に配置すべし

ラジオボタンをグループ化するのは
ラジオボタンとはもともと択一式の UI なわけで
1つを選択したら、残りのものを OFF にするためである。

グループ化することで、残りがどれかを判断できる、という仕組み。

そこで1つ罠に落ちたのは
RadioButton は RadioGroup の 直下に配置しない
この グループが機能しない ということ。

私がやったのはこんな感じ。

  1. <RadioGroup>
  2.  
  3.     <LinearLayout>
  4.         <RadioButton>
  5.         <TextView>
  6.     </LinearLayout>
  7.  
  8.     <LinearLayout>
  9.         <RadioButton>
  10.         <TextView>
  11.     </LinearLayout>
  12.  
  13.     <LinearLayout>
  14.         <RadioButton>
  15.         <TextView>
  16.     </LinearLayout>
  17. </RadioGroup>

これでグループが機能しなくなった。

Android | 2011-04-18 (月) 13:34:36 |
« 前ページへ次ページへ »