2017-07-11 4 views
0

J'ai vu d'autres réponses telles que this one et this one qui expliquent la façon correcte d'ajouter un nouvel affichage à un objet RemoteViews. Dans le premier lien, il est spécifié qu'il doit y avoir un LinearLayout imbriqué à l'intérieur d'un LinearLayout externe de sorte que la disposition interne soit référencée dans la méthode addView, par ex. addView(innerLayoutID, view). Pourquoi faire référence à la disposition intérieure au lieu de la disposition externe? Est-ce que addView ne fonctionne pas avec la disposition externe ou est-ce juste une opinion personnelle?Comment utiliser remoteViews 'addView() de manière appropriée

Répondre

0

Il s'avère que la réponse dans le premier lien était généralement correcte, mais je ne pouvais pas l'exécuter exactement comme il a été posté, donc j'avais besoin de plus de détails afin de le faire fonctionner dans mon projet. J'ai posté mon code ci-dessous pour référence future.

Notez qu'une très importante qui n'a pas été spécifiée dans les autres threads est que rv.addView() nécessitait la même disposition que celle spécifiée dans l'objet rv; c'est-à-dire, je ne pouvais pas avoir un LinearLayout imbriqué dans un autre LinearLayout, puis référence l'intérieur LinearLayout. J'ai dû faire référence à l'instance externe puisque c'est ce qui a été référencé dans l'instance parent rv.

Mon onUpdate() est spécifique à Edge API Panel de Samsung Look, mais le format général est le même:

@Override 
public void onUpdate(Context context, SlookCocktailManager manager, int[] cocktailIds) { 
    //Parent RemoteViews object 
    RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.main_view); 
    for (int i = 0; i < someObjectArray.length; i++) { 
     //Create new remote view using the xml file that represents a list entry 
     RemoteViews listEntryLayout = new RemoteViews(context.getPackageName(), R.layout.list_entry); 
     //Set the text of the TextView that is inside the above specified listEntryLayout RemoteViews 
     listEntryLayout.setTextViewText(R.id.stock_text, someObjectArray[i].getName()); 
     //Add the new remote view to the parent/containing Layout object 
     rv.addView(R.id.main_layout, listEntryLayout); 
    } 
    //standard update 
    if (cocktailIds != null) { 
     for (int id : cocktailIds) { 
      manager.updateCocktail(id, rv); 
     } 
    } 
} 

main_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/main_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:importantForAccessibility="2" 
    android:orientation="vertical" > 
</LinearLayout> 

list_entry.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/stock_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/stock_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:background="@android:color/holo_green_light" 
     android:text="TextView" 
     android:textSize="20dp"/> 
</LinearLayout>