ウィジェットの作り方

[edit]

ウィジェット

http://www.techfirm.co.jp/lab/android/widget.html

dip = (セル数 * 74dip) - 2dip

  • res/xml/appwidget.xml
 <?xml version="1.0" encoding="UTF-8"?>
 <appwidget-provider
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:minWidth="72dip"
     android:minHeight="72dip"
     android:initialLayout="@layout/main"
     android:updatePeriodMillis="0"
     />

AppWidgetProviderの以下の処理をオーバーライドすることで、AppWidgetの処理を記述できます。

 onEnabled()
  AppWidgetが作成される際に呼ばれます。
  同じAppWidgetを複数起動した際には、初回のみ呼ばれます。
  全体的な初期化処理が必要な場合はここに記述します。
 onUpdate()
  AppWidgetが更新される際に呼ばれます。
  updatePeriodMillis等で更新間隔を設定していれば、そのタイミングで呼ばれます。
  また、AppWidgetを起動した際にも一度呼ばれます。
 onDeleted()
  AppWidgetが削除された際に呼ばれます。
  終了処理が必要な場合はここに記述します。
 onDisabled()
  AppWidgetが全て削除された際に呼ばれます。
  全体的な終了処理が必要な場合はここに記述します。
 onReceive()
  アクションを受け取り、AppWidgetProviderの各メソッドの呼び出しを処理します。
[edit]

ウィジェット設置の際に設定画面を表示させる

”android.appwidget.provider”のXML内、”appwidget-provider”要素に以下の属性を指定すれば可能です。

    android:configure="呼び出すActivityのフルパス"
 public class ClockConfigure extends Activity implements OnClickListener{
 
     private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
     private ArrayList<ImageButton> btnList = new ArrayList<ImageButton>();
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         setResult(RESULT_CANCELED); // 設置されなかった場合に正しくキャンセルされるように
         setContentView(R.layout.config); // 設定画面
 
         Intent intent = getIntent(); // AppWidgetID の取得
         Bundle extras = intent.getExtras();
         if (extras != null) {
             mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
         }
         // AppWidgetId がなければ終了
         if(mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){
             finish();
         }
 
         // ボタンクリック検出用
         int btns[] = { R.id.btn1, R.id.btn2, R.id.btn3 };
         for(int i = 0; i < btns.length; i++){
             ImageButton btn;
             btn = (ImageButton) findViewById(btns[i]);
             btn.setOnClickListener(this);
             btnList.add(btn);
         }
         Button btnok = (Button) findViewById(R.id.exit_button);
         btnok.setOnClickListener(this);
 
     }
 
     // デザイン選択(ボタンクリック)
     public void onClick(View v) {
         for (int i = 0; i < btnList.size(); i++) {
             if (v == btnList.get(i)) {  //イベントの起きたViewがどれか調べる
                 SharedPreferences pref = getSharedPreferences( "Widget" +  mAppWidgetId, MODE_PRIVATE);
                 Editor e = pref.edit();
                 switch (i) {
                 case 0:
                     //if (DEBUG) Toast.makeText( this, "btn1 clicked!", Toast.LENGTH_SHORT ).show();
                     e.putString("dial", "dial1").commit();
                     break;
                 case 1:
                     e.putString("dial", "dial2").commit();
                     break;
                 case 2:
                     e.putString("dial", "dial3").commit();
                     break;
                 default:
                     break;
                 }
             }
         }
     }
 
     // OKボタン
     public void onClickOk(View v) {
         Log.v("TEST", "AppWidgetExampleConfigure#onClick():mAppWidgetId=" + mAppWidgetId);
         finishConfigure();
     }
   
 
     private void finishConfigure() {
         RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.clock_widget);
 
 
         // ウィジェットの更新
         AppWidgetManager awm = AppWidgetManager.getInstance(this);
         awm.updateAppWidget(mAppWidgetId, remoteViews);
 
         // RESULT_OK
         Intent resultValue = new Intent();
         resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
         setResult(RESULT_OK, resultValue);
         finish();
     }
 }