29 votes

Comment créer des applications android avec app widget dans une seule application

J'ai déjà fait une application android qui est de stocker la date avec la personne nom et numéro de téléphone.

Maintenant, je dois développer un widget pour cette application à montrer aujourd'hui (date, nom, numéro de téléphone) avec le bouton.

Exigences:

  1. Seule application avec l'application et le widget.
  2. Lorsque je clique sur un bouton qui est dans le widget, il va commencer mon application.
  3. Widget de données doit toujours synchroniser avec mon app - quand aujourd'hui journée (5 et ajoute 5 plus personne alors widget écran 10 données)
  4. Comment pourrais-je concevoir ce widget? Toutes les lignes directrices? J'ai utiliser horizontal scrollview.

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

Merci de partager votre expérience et donner une idée de mon widget de l'application.

26voto

Roadies Points 940

Créer et configurer un widget

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

<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éta-données pour le widget via le android:name="android.appwidget.fournisseur de l'attribut. Le fichier de configuration visées par la présente méta-données contient les paramètres de configuration du widget. Si contient par exemple la mise à jour de l'interface, de la taille et de la disposition initiale de la widget.

Créer un nouveau fichier myshape.xml dans l' /res/drawable répertoire. Ce fichier permettra de définir 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 les éléments suivants widget_layout.xml le fichier dans le cadre du res/layout dossier.

<?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> 

maintenant, faire 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);
    }
  }

7voto

Harshid Points 2354

Je viens de trouver quelques jour j'ai un peu de comment solution.je suis donc part de mon idée.

Ce site est très utile pour moi.

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

- Je faire des changements et de faire mon travail.

Exigence solution:

1. Faire du Récepteur et de mettre en manifeste l'autorisation de ce genre.

<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é nécessitent haut textview cliquez donc pouvez faire en utilisant texview id en 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 tiens à appeler de la base de données et de chercher de l'enregistrement et de l'afficher.maintenant la question qu'à propos de la mise à jour?

donc, je suis habitué classe timer et exécuter toutes les 1000sec raison de plus de widget est toujours de mise à jour de 30min(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 tout de la requête puis mettre des commentaires et merci à tous qui me donne plein de soutien pour faire de cette réponse utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X