2011年5月31日火曜日

[Android] Widgetだけを作ってみる

どうでもいいですが、会社から「ちゃんと勉強しているのかい?」ときかれました。
レポート書く暇もなんかめんどくさいので
このblogをさらすことにしましたよ。ふふ。

そんな前書きはともかく今日は「Widget」について。
Widget は 「ウィジェット」と読みます。下噛む。

ウィジェットを作ってみようと思います。
最初なのでなにも起こらないウィジェットを作ります。

1.ウィジェットのレイアウトXMLを作る。
ウィジェットのデザインを考えてまずは見た目から入ります。
「drawable」 直下に適当な画像を置き、
「layout」直下に適当なレイアウトwigetLayoutのXMLファイルを作ります。

見本。
appwidget.xml

  1. <!--xml version="1.0" encoding="utf-8"?-->  
  2. <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">  
  3.     <imageview android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/buttons">  
  4.     </imageview>  
  5. </linearlayout>  

長いですが、ただdrawableの中にあるbuttonsっていう画像を表示させているだけです。

で、次にいきます。

2.widgetのXMLを定義する
WidgetProviderを使うのでXMLを定義します。
何を書くのかというと「こんなデザインで○分ごとに更新されます」というようなことです。

見本。
appwidget.xml(めんどくさいのでファイル名は一緒)

  1. <!--xml version="1.0" encoding="utf-8"?-->  
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initiallayout="@layout/appwidget" android:minheight="72dip" android:minwidth="72dip" android:updateperiodmillis="0">  
  3. </appwidget-provider>  

これは1で作ったレイアウトXMLを使用しています。
注目はここ。

  1. android:updatePeriodMillis="0"  

これは更新感覚です。Millisっていうことなので秒数を表しています。
今回は更新もしないウィジェットなので0で。

3.AppWidgetProvider を実装する
続いてはjavaです。コードに入っていきます。
今回はなにもしないウィジェットなのでこんな感じで。

見本。
appwidget.java(めんどくさいのでファイル名は一緒)

  1. import android.appwidget.AppWidgetManager;  
  2. import android.appwidget.AppWidgetProvider;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5.   
  6. public class appwidget extends AppWidgetProvider {  
  7.    
  8.  @Override  
  9.  public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {  
  10.   super.onUpdate(context, appWidgetManager, appWidgetIds);  
  11.  }  
  12.    
  13.  @Override  
  14.  public void onEnabled(Context context) {  
  15.   super.onEnabled(context);  
  16.  }  
  17.    
  18.   
  19.    
  20.  @Override  
  21.  public void onDeleted(Context context, int[] appWidgetIds) {  
  22.   super.onDeleted(context, appWidgetIds);  
  23.  }  
  24.    
  25.  @Override  
  26.  public void onDisabled(Context context) {  
  27.   super.onDisabled(context);  
  28.  }  
  29.    
  30.  @Override  
  31.  public void onReceive(Context context, Intent intent) {  
  32.   super.onReceive(context, intent);  
  33.  }  
  34.   
  35. }  

単純にAppWidgetProviderを継承して親メソッドを呼んでいるだけです。
本当に、なにもしません。

4.最後にAndroidmManifest.xmlに追記する
最後はAndroidManifest.xmlに追記します。ウィジェットなのでAcitityではないので注意。
画面に張り付いてじーっとまっているという感じなので
処理を受け取るReceiverを使います。

見本。
AndroidManifest.xml
  1. <!--xml version="1.0" encoding="utf-8"?-->  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.co.mogakana.wiget.test" android:versioncode="1" android:versionname="1.0">  
  3.     <uses-sdk android:minsdkversion="8">  
  4.   
  5.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  6.         <receiver android:name=".appwidget">  
  7.             <intent-filter>  
  8.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>  
  9.               
  10.             </intent-filter>  
  11.             <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget"></meta-data>  
  12.         </receiver>  
  13.   
  14.     </application>  
  15. </uses-sdk></manifest>  

作成のポイントとして。
まずはmeta-dateでwidgetを使うよ、と定義します。

  1. <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget"></meta-data>          


そして次にIntent-filterで先ほどmeta-detaで定義した名前を使用して受け取る準備をします。

  1. <intent-filter>  
  2.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>              
  3. </intent-filter>  

今回は単純なものなので更新時を受け取ります。
が、更新しないウィジェットなので意味はないですが、入れておかないと使えないので・・・。

で、実行してウィジェットを貼るとこんな画面になります。























小さい!!(笑)
これは単純に解像度(図のファイルは横3縦1なのに、レイアウトファイルでは横1縦1にしている)の問題なのですが・・・
長くなるのでまた今度。

0 件のコメント:

コメントを投稿