web-dev-qa-db-fra.com

Comment construire un widget simple Android

J'ai donc un peu d'expérience dans la construction d'applications Android. Mais maintenant, je voudrais créer un widget pour Android qui s'asseoirait sur l'écran d'accueil et afficherait un bouton, et lorsque le bouton est enfoncé, il émet un son. J'ai regardé des tutoriels en ligne sur la façon de configurer un widget Android mais je n'arrive pas à le comprendre. Y a-t-il de bons didacticiels sur la façon de créer un widget autonome aussi simple ou quelque part où je peux commencer? Merci d'avance, Peter

28
Peter

créez d'abord un nouveau fichier de disposition dans res/layout, sous la structure du projet, qui définira la disposition du widget (widgetlayout.xml) selon la structure suivante.

<TextView Android:text="@string/widgettext" 
              Android:layout_width="0dp"
              Android:layout_height="wrap_content"
              Android:layout_weight="0.8"
              Android:layout_gravity="center_vertical"
              Android:textColor="#000000"></TextView>
<TextView Android:text="@string/widgetmoodtext"
              Android:id="@+id/widgetMood" Android:layout_width="0dp" 
              Android:layout_height="wrap_content" 
              Android:layout_weight="0.3" 
              Android:layout_gravity="center_vertical" 
              Android:textColor="#000000"></TextView>
<ImageButton Android:id="@+id/widgetBtn" 
             Android:layout_width="0dp" 
             Android:layout_height="wrap_content" 
             Android:layout_weight="0.5"  
             Android:src="@drawable/smile_icon" 
             Android:layout_gravity="center_vertical">
 </ImageButton>

Créez le dossier res/xml sous la structure du projet Créez un fichier xml (widgetproviderinfo.xml) avec les paramètres suivants:

 <appwidget-provider
           xmlns:Android="http://schemas.Android.com/apk/res/Android" 
           Android:minWidth="220dp" 
           Android:minHeight="72dp"
           Android:updatePeriodMillis="86400000" 
           Android:initialLayout="@layout/widgetlayout">
       </appwidget-provider>

Maintenant, vous devez créer le service qui réagit à l'interaction de l'utilisateur avec le bouton d'image smiley (CurrentMoodService.Java).

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStart(intent, startId);
            updateMood(intent);
    stopSelf(startId);
    return START_STICKY;
}

private void updateMood(Intent intent) {
       if (intent != null){
        String requestedAction = intent.getAction();
        if (requestedAction != null &&  requestedAction.equals(UPDATEMOOD)){
            this.currentMood = getRandomMood();
            int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0);
            AppWidgetManager appWidgetMan = AppWidgetManager.getInstance(this);
            RemoteViews views = new RemoteViews(this.getPackageName(),R.layout.widgetlayout);
            views.setTextViewText(R.id.widgetMood, currentMood);
            appWidgetMan.updateAppWidget(widgetId, views);  
        }
       }
   }

Après avoir défini le service, il est temps d'implémenter la classe de fournisseur de widget (CurrentMoodWidgetProvider.Java).

    @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);

    for (int i=0; i<appWidgetIds.length; i++) {
        int appWidgetId = appWidgetIds[i];
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
        Intent intent = new Intent(context, CurrentMoodService.class);
        intent.setAction(CurrentMoodService.UPDATEMOOD);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
        views.setOnClickPendingIntent(R.id.widgetBtn, pendingIntent);
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}   

Enfin, il est nécessaire de déclarer le service et le AppWidgetProvider dans le manifeste (AndroidManifest.xml).

    <service Android:name=".CurrentMoodService">
    </service>
<receiver Android:name=".CurrentMoodWidgetProvider">
    <intent-filter>
        <action Android:name="Android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data Android:name="Android.appwidget.provider"
               Android:resource="@xml/widgetproviderinfo" />
</receiver>

et si vous souhaitez télécharger l'intégralité du code source, consultez l'url ci-dessous ...

http://sites.google.com/site/androidsourcecode/src/CurrentMoodWidgetProject.rar?attredirects=

44
Akash Thakkar