- Android
- 2012-01-05 - 更新:2012-05-18
Androidアプリ「たびろく」を公開しました。
https://market.android.com/search?q=tabiroku&c=apps
「たびろく」は旅の思い出を記録するアプリです。
タイトルとコメントを付けて保存することができ、それをそのままmixiやFacebook等のメール更新が可能です。
Androidアプリ「たびろく」を公開しました。
https://market.android.com/search?q=tabiroku&c=apps
「たびろく」は旅の思い出を記録するアプリです。
タイトルとコメントを付けて保存することができ、それをそのままmixiやFacebook等のメール更新が可能です。
PreferenceActivityのonCreateで処理します。
例では条件を何も指定していませんが、任意に条件を指定して実装してください。
例)チェックボックスの設定項目を無効化
PreferenceScreen prefScreen = getPreferenceScreen(); CheckBoxPreference checkboxPreference = (CheckBoxPreference)prefScreen.findPreference("key"); checkboxPreference.setEnabled(false);
子項目として親項目と依存関係を持たせる場合
PreferenceScreen prefScreen = getPreferenceScreen(); CheckBoxPreference checkboxPreference = (CheckBoxPreference)prefScreen.findPreference("key"); checkboxPreference.setDependency("親項目のkey");
xmlで指定
android:dependency="親項目のandroid:key"
GoogleMapにアイコンを表示し、タップすると何らかの処理をしたいとき、通常のonTapメソッドで処理を実行しようとすると、地図の拡大縮小時、アイコンに指が触れているとタップされたことになってしまいます。
これを回避するために、ジェスチャーリスナーを実装し、シングルタップアップにて処理をするようにします。
android.view.GestureDetector.OnGestureListener
public class PinItemizedOverlay extends ItemizedOverlay<OverlayItem> implements OnGestureListener { private List<GeoPoint> points = new ArrayList<GeoPoint>(); private Context context; private GestureDetector gestureDetector = null; private MapView mMapView; private Drawable defaultMarker; public PinItemizedOverlay(Drawable defaultMarker, Context context) { super( boundCenterBottom(defaultMarker) ); setLastFocusedIndex(-1); populate(); this.context = context; this.defaultMarker = defaultMarker; gestureDetector = new GestureDetector(this); } @Override protected OverlayItem createItem(int i) { GeoPoint point = points.get(i); OverlayItem overlayItem = new OverlayItem(point, null, null); overlayItem.setMarker(boundCenterBottom(defaultMarker)); //これをしないとhitTestでNullPointerExceptionが発生します。 return overlayItem; } @Override public int size() { return points.size(); } public void addPin(GeoPoint point, String title, String snippet, int icontype) { if (getIndexGeoPoint(point) == -1) { this.points.add(point); this.icontype.add(icontype); } setLastFocusedIndex(-1); populate(); } // 位置が一致するか(一致しない場合は -1を返す) private int getIndexGeoPoint(GeoPoint newPoint) { int result = -1; int size = this.points.size(); for (int i = 0; i < size; i++) { GeoPoint point = this.points.get(i); if (point.equals(newPoint)) { result = i; break; } } return result; }
ItemizedOverlayクラスを継承してGoogleMapに複数のポイントを表示する際、アイコンを変えたい場合、レイヤーを別にする必要があります。
同じレイヤーでアイコンを変えたい場合には、アイコン生成時に呼ばれる「createItem」メソッド内で変えるようにするとできるようです。
その際はアイコン用のリストを作り、switch文などで切り替えすると便利です。
public class PinItemizedOverlay extends ItemizedOverlay<OverlayItem> { private List<GeoPoint> points = new ArrayList<GeoPoint>(); private List<Integer> icontype = new ArrayList<Integer>(); private Context context; public PinItemizedOverlay(Drawable defaultMarker, Context context) { super( boundCenterBottom(defaultMarker) ); setLastFocusedIndex(-1); populate(); this.context = context; } @Override protected OverlayItem createItem(int i) { Drawable icon = null; switch(icontype.get(i)) { case 0: icon = context.getResources().getDrawable(R.drawable.icon0); break; case 1: icon = context.getResources().getDrawable(R.drawable.icon1); break; case 2: icon = context.getResources().getDrawable(R.drawable.icon2); break; default: icon = context.getResources().getDrawable(R.drawable.icon0); break; } GeoPoint point = points.get(i); OverlayItem overlayItem = new OverlayItem(point, null, null); overlayItem.setMarker(boundCenterBottom(icon)); return overlayItem; } public void addPin(GeoPoint point, String title, String snippet, int icontype) { if (getIndexGeoPoint(point) == -1) { this.points.add(point); this.icontype.add(icontype); } setLastFocusedIndex(-1); populate(); } // 位置が一致するか(一致しない場合は -1を返す) private int getIndexGeoPoint(GeoPoint newPoint) { int result = -1; int size = this.points.size(); for (int i = 0; i < size; i++) { GeoPoint point = this.points.get(i); if (point.equals(newPoint)) { result = i; break; } } return result; } }
SDカードに画像を保存する際、同じ名前で上書き保存すると、画像自身は上書きされますが、
元画像のサムネイルだけが残ってしまいます。
実際は、サムネイルとデータベースにもデータが残っているのではないでしょうか。
そのため、上書き保存したい場合は、データベースから削除する必要があります。
String PATH = Environment.getExternalStorageDirectory().toString(); Uri IMAGE_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; File file = new File(PATH, filename); if(file.exists()) { String[] proj = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj, MediaStore.Images.Media.DATA + " = ?", new String[] { PATH + "/" + filename }, null); if(cursor.getCount() != 0) { cursor.moveToFirst(); Uri deleteUri = ContentUris.appendId( MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon(), cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID))).build(); getContentResolver().delete(deleteUri, null, null); } file.delete(); }