web-dev-qa-db-fra.com

Comment créer Android avec widget d'application dans une seule application

J'en ai déjà fait une application Android qui stocke la date avec le nom de la personne et le numéro de téléphone.

Maintenant, je dois en développer un widget pour que cette application affiche aujourd'hui (date, nom de la personne et numéro de téléphone) avec le bouton.

Exigences:

  1. Application unique avec application et widget.
  2. Lorsque je clique sur un bouton qui se trouve dans le widget, il démarre mon application.
  3. Les données du widget doivent toujours se synchroniser avec mon application - le jour d'aujourd'hui (la personne 5 et l'application ajoutent 5 personnes de plus, puis le widget affiche les données de 10 personnes)
  4. Comment puis-je concevoir ce widget? Des directives? Je dois utiliser ScrollView horizontal.

J'ai fait une démo de widget simple mais je ne sais pas comment le synchroniser avec mon application.

Veuillez partager votre expérience et donner une idée de mon widget et de mon application.

37
Harshid

Je trouve quelques jours que j'ai en quelque sorte la solution. Je partage donc mon idée.

Ce site m'a été très utile.

http://kasperholtze.com/Android/how-to-make-a-simple-Android-widget/

J'ai fait quelques changements et j'ai fait mon travail.

Solution d'exigence:

1. Faites Receiver et mettez en autorisation manifeste comme ceci.

<receiver
        Android:name=".WatchWidget"
        Android:label="WatchWidget" >
        <intent-filter>
            <action Android:name="Android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data
            Android:name="Android.appwidget.provider"
            Android:resource="@xml/watch_widget_provider" />
    </receiver>

2. De mon côté, il faut cliquer sur TextView pour pouvoir utiliser l'ID TextView dans onUpdate().

    remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_lay);

    Intent intent = new Intent(context, TestActivity.class);
    intent.setAction("callActivity");
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    remoteViews.setOnClickPendingIntent(R.id.widget_textview, pendingIntent); 
    appWidgetManager.updateAppWidget(new ComponentName(context,WatchWidget.class), remoteViews);

3. Je veux appeler la base de données et récupérer l'enregistrement et l'afficher. Maintenant, demandez-vous ce qu'il en est de la mise à jour?

J'ai donc utilisé la classe de minuterie et exécuté toutes les 1000 secondes car le widget est toujours mis à jour 30 minutes (peut-être).

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

    this.appWidgetManager = appWidgetManager;
    try {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager,appWidgetIds), 1, 1000);

    } catch (Exception e) {
        System.out.println("Exception:");
    }
    updateSwitch1(context, appWidgetManager, appWidgetIds[0]);

}

Si vous avez des questions, mettez un commentaire et merci à tous ceux qui m'ont apporté leur soutien pour rendre cette réponse utile.

8
Harshid

Créer et configurer un widget

Pour enregistrer un widget, vous créez un BroadcastReceiver avec un filtre d'intention pour l'action Android.appwidget.action.APPWIDGET_UPDATE.

<receiver
       Android:icon="@drawable/icon"
       Android:label="Example Widget"
       Android:name="MyWidgetProvider" >
       <intent-filter >
            <action Android:name="Android.appwidget.action.APPWIDGET_UPDATE" />
       </intent-filter>

       <meta-data
          Android:name="Android.appwidget.provider"
          Android:resource="@xml/widget_info" />
</receiver> 

Vous spécifiez également les métadonnées du widget via l'attribut Android: name = "Android.appwidget.provider. Le fichier de configuration référencé par ces métadonnées contient les paramètres de configuration du widget. S'il contient par exemple l'interface de mise à jour, le la taille et la disposition initiale du widget.

Créez un nouveau fichier myshape.xml dans le répertoire/res/drawable. Ce fichier définira l'arrière-plan que nous utilisons dans votre widget.

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
           Android:shape="rectangle" >

    <stroke
        Android:width="2dp"
        Android:color="#FFFFFFFF" />

    <gradient
        Android:angle="225"
        Android:endColor="#DD2ECCFA"
        Android:startColor="#DD000000" />

    <corners
        Android:bottomLeftRadius="7dp"
        Android:bottomRightRadius="7dp"
        Android:topLeftRadius="7dp"
        Android:topRightRadius="7dp" />

</shape> 

Définir ce qui suit widget_layout.xml fichier sous le dossier res/layout.

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
          Android:id="@+id/layout"
          Android:layout_width="match_parent"
          Android:layout_height="match_parent"
          Android:layout_margin="8dip"
          Android:background="@drawable/myshape" >

        <TextView
            Android:id="@+id/update"
            style="@Android:style/TextAppearance.Medium"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_gravity="center"
            Android:gravity="center_horizontal|center_vertical"
            Android:layout_margin="4dip"
            Android:text="Static Text" >
        </TextView>

    </LinearLayout> 

faire maintenant la classe.

public class MyWidgetProvider extends AppWidgetProvider {

  private static final String ACTION_CLICK = "ACTION_CLICK";  

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

    // Get all ids
    ComponentName thisWidget = new ComponentName(context,
        MyWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    for (int widgetId : allWidgetIds) {
      // Create some random data
      int number = (new Random().nextInt(100));

      RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
          R.layout.widget_layout);
      Log.w("WidgetExample", String.valueOf(number));
      // Set the text
      remoteViews.setTextViewText(R.id.update, String.valueOf(number));

      // Register an onClickListener
      Intent intent = new Intent(context, MyWidgetProvider.class);

      intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

      PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
          0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
      appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
  }
36
Roadies