2011年12月17日土曜日

【Android】ウィジェットを確実に更新させる

Androidのウィジェットの内容を更新する場合、以下のように
updateAppWidgetとすると思います。

  1. private void updateAppWidget(Context context, RemoteViews remoteViews) {  
  2.     ComponentName thisWidget = new ComponentName(context, ClockAppWidgetProvider.class);  
  3.     AppWidgetManager manager = AppWidgetManager.getInstance(context);  
  4.     manager.updateAppWidget(thisWidget, remoteViews);  
  5. }  

ただ、複数配置した時など、各ウィジェットへ確実に更新が行われないようです。
特に時計ウィジェットだと顕著です。

その場合、

  1. int[] appWidgetIds = manager.getAppWidgetIds(thisWidget);  
  2. for (int i : appWidgetIds) {  
  3.     manager.updateAppWidget(i, remoteViews);  
  4. }  

のように各ウィジェットIDに対して更新するようにすると、確実に更新されるようです。

ただし、重いです。。何が原因で重いのかはまだわからないですが、、、

2011年12月16日金曜日

【Android】ダイアログで画面外を触った場合に閉じる

ダイアログは2種類ある。

通常の Dialog を継承しているもの。
Activityにtheme (@android:style/Theme.Dialog など) を設定してDialog風にしているもの。

指定の方法がそれぞれ違う。



1. 通常の Dialog を継承しているもの。
  1. final AlertDialog dialog = alertinformation.create();  
  2. dialog.setCanceledOnTouchOutside(true);  

Dialog に対して、setCanceledOnTouchOutside を設定してやるといい。

2. Activityにtheme (@android:style/Theme.Dialog など) を設定してDialog風にしているもの。
  1. // ウィンドウ外を触った場合、閉じる  
  2. @Override  
  3. public boolean dispatchTouchEvent(MotionEvent ev) {  
  4.     Rect dialogBounds = new Rect();  
  5.     getWindow().getDecorView().getHitRect(dialogBounds);  
  6.   
  7.     if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {  
  8.         this.finish();  
  9.     }  
  10.     return super.dispatchTouchEvent(ev);  
  11. }  

イベントで画面外をタッチしている場合に画面を終了する。

2011年12月15日木曜日

【Android】Proguard使用時の注意点

Proguard使用時の注意

元々Android用ではないため、Javaのソースのみを難読化し、
XMLは無視する様子。

そのため、難読化しないクラスを除外設定しないといけない。

proguard.cfg に設定があるので編集する。

1. クラス名の難読化除外。

おすすめ
  1. -keep public class * extends android.app.Activity  
  2. -keep public class * extends android.app.Application  
  3. -keep public class * extends android.app.Service  
  4. -keep public class * extends android.content.BroadcastReceiver  
  5. -keep public class * extends android.content.ContentProvider  
  6. -keep public class * extends android.app.backup.BackupAgentHelper  
  7. -keep public class * extends android.preference.Preference  
  8. -keep public class com.android.vending.licensing.ILicensingService  
  9. -keep public class * extends android.view.View  
  10. -keep public class * extends android.support.v4.app.Fragment  

この場合、クラス名は何でもよくてandroid.view.View、またはその子を継承しているもの
-keep public class * extends android.view.View

2. メソッド名の難読化除外

xml に android:onClick がある場合、xmlは難読化しないのでjavaのメソッド名も除外に指定する。

  1. -keepclassmembers class * {  
  2. public void On*Click(android.view.View);  
  3. public void on*Click(android.view.View);  
  4. }  

そのため、onClickメソッドはやっぱり on*Click という命名規則にした方が良い。