アーカイブ

2009 年 6 月 のアーカイブ

[android] AppWidget onClick時にIDを渡す

2009 年 6 月 21 日 コメントはありません

前回はViewのonClickリスナにPendingIntentを仕掛けることによって、AppWidgetのクリックイベントを拾うことができました。

複数のWidgetを配置している場合には、どのWidgetがクリックされたかを判断する必要があります。
Intent.setData()を使用してActivityにAppWidgetIDを渡してあげればOKです。


public class SampleWidgetProvider extends AppWidgetProvider {
  public static final Uri CONTENT_URI = Uri.parse("content://jp.xfutures.android.sample");

  public void onUpdate(
      Context context,
      AppWidgetManager appWidgetManager,
      int[] appWidgetIds
  ){
    for(int id : appWidgetIds){
      // 起動するActivityのIntentを作成する
      Intent intent = new Intent(context, SampleWidgetActivity.class);

      // AppWidget IDを設定する
      Uri uri = ContentUris.withAppendedId(CONTENT_URI, id);
      intent.setData(uri);

      // PendingIntentを取得する
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

      // onClickリスナを設定する
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
      views.setOnClickPendingIntent(R.id.TextView01, pendingIntent);

      // AppWidgetを更新する
      appWidgetManager.updateAppWidget(id, views);
    }
  }
}

受けるとる時はIntent.getData()ですね。


public class SampleWidgetActivity extends Activity {
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.onclick);

    // AppWidget IDを取得する
    Uri uri = getIntent().getData();
    int id =  (int)ContentUris.parseId(uri);

    // AppWidget IDをTextViewに設定する
    TextView view = (TextView)findViewById(R.id.TextViewID);
    view.setText(String.format("WidgetID is %d.", id));
  }
}

AndroidSample2009062101.zip

AppWidgetでのonClickの取り方

2009 年 6 月 20 日 コメントはありません

AppWidget上でのクリックイベントは、公式ドキュメントにあるようにPendingIntentを使って取得することができます。

AppWidgetProvider.onUpdateの中でビューをアップデートするときに、そのビューに対してPendingIntentを仕掛けてあげればOKです。


public class SampleWidgetProvider extends AppWidgetProvider {
  public void onUpdate(
      Context context,
      AppWidgetManager appWidgetManager,
      int[] appWidgetIds
  ){
    for(int id : appWidgetIds){
      // 起動するActivityのIntentを作成する
      Intent intent = new Intent(context, SampleWidgetActivity.class);
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

      // onClickリスナを設定する
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
      views.setOnClickPendingIntent(R.id.TextView01, pendingIntent);

      // AppWidgetを更新する
      appWidgetManager.updateAppWidget(id, views);
    }
  }
}

AppWidgetのインスタンス生成タイミング

2009 年 6 月 14 日 コメントはありません

AppWidgetではandroid:updatePeriodMillisで指定した周期でAppWidgetProvider.onUpdateが実行されますが、実行時に毎回インスタンスを作り直しているようです。
コンストラクタで画像を生成してonUpdateで表示するようにしていたら、onUpdateのたびにコンストラクタが呼ばれて悲しいことに・・・。

android:updatePeriodMillisの値を小さくするとインスタンス生成のコストが大きそうでしたので、0msecにして初回のみonUpdateが叩かれるようにし、onUpdateの中でServiceを起動、Timerを仕掛けて更新処理を行ってみたのですが・・・。
エミュレータや手持ちのADP1では問題なく動くのですが、Marketのコメントとか見るとホンモノの端末だとダメっぽいです。
Service化するまえは動いていたのにアップデートしたら動かなくなったという方もいました。
私の環境では再現できなくて原因がわからないため、Service化は断念しました。



色を変えられるようにしたTiny Clock Widgetは今週中には公開したいです。
とりあえず4色から選択できるだけですが。
自由なカラーカスタマイズは今月中には・・・。

Tiny Clock WidgetカラフルVer

カテゴリー: Android, Android Programming タグ: ,

android marketのコピープロテクションがオフにできない・・・

2009 年 6 月 11 日 コメントはありません

Tiny Clock Widget ver0.2をアップロードしてADP1で確認してみたら、なぜかマーケットに表示されない・・・。

よーくみるとコピープロテクションがONになってました。
間違ってクリックしてしまったみたいです。
しかも、一度ONにするとOFFに戻せないようです。

しょうがないから別アプリケーションとして登録しなおしました。
せっかくいい感じでランキングがあがってたのに・・・。

カテゴリー: Android タグ:

androidのWidgetを作ってみた

2009 年 6 月 7 日 コメントはありません

埃をかぶっていたADP1を起こしてWidgetを作ってみました。
1×1 cellのアナログ時計です。

Marketに登録してありますので、「Tiny Clock Widget」で検索してみてください。

tinyclock

カテゴリー: Android タグ: