2017-06-14 2 views
0

Je laisse utilisateur de sélectionner le widget dans la liste des widgets en ouvrant les widgets intentionCliquez ne fonctionne pas sur les widgets ajoutés par l'utilisateur avec dans l'application Android

public void initAppWidget() { 
    try { 
     mAppWidgetManager = AppWidgetManager.getInstance(this); 
     mAppWidgetHost = new AppWidgetHost(this, Constants.APPWIDGET_HOST_ID); 

    } catch 
      (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void selectWidget() { 
    int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); 
    Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); 
    pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    startActivityForResult(pickIntent, Constants.SELECT_APPWIDGET); 
} 

onActivityResult sera appelée lorsque l'utilisateur sélectionne le widget de la liste

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    switch (requestCode) { 

     case Constants.SELECT_APPWIDGET: 
      if (resultCode == RESULT_OK) { 
       configureWidget(data); 

      } else if (resultCode == RESULT_CANCELED && data != null) { 
       int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 
       if (appWidgetId != -1) { 
        mAppWidgetHost.deleteAppWidgetId(appWidgetId); 
       } 
      } 
      break; 

     case Constants.REQUEST_CREATE_APPWIDGET: 
      if (resultCode == RESULT_OK) { 
       createWidget(data); 

      } else if (resultCode == RESULT_CANCELED && data != null) { 
       int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 
       if (appWidgetId != -1) { 
        mAppWidgetHost.deleteAppWidgetId(appWidgetId); 
       } 
      } 

      break; 
    } 
} 

public void configureWidget(Intent data) { 
    Bundle extras = data.getExtras(); 
    int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 
    AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); 

    if (appWidgetInfo.configure != null) { 
     Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); 
     intent.setComponent(appWidgetInfo.configure); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     startActivityForResult(intent, Constants.REQUEST_CREATE_APPWIDGET); 
    } else { 
     createWidget(data); 
    } 
} 

fonction Enfin createWidget ajoute la vue widget à la disposition linéaire

public void createWidget(Intent data) { 
    int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 
    AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); 

    AppWidgetHostView hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); 
    hostView.setAppWidget(appWidgetId, appWidgetInfo); 
    hostView.setId(id); 
    ll_widgets_list.addView(hostView); 
    id++; 
} 

Mais certains widgets ne prennent pas de clic, par exemple. Horloge analogique . Certains widgets comme Google Drive contiennent d'autres vues qui sont cliquables et fonctionnent bien. Widget ne se met pas à jour chaque fois que l'utilisateur effectue une action via celui-ci.

Répondre

0
mAppWidgetHost.startListening(); 

Cette ligne manquait dans la fonction initAppWidget() qui écoute les modifications du widget.