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