【发布时间】:2021-11-07 17:16:01
【问题描述】:
我正在为 Android 创建一个小部件,但我遇到了问题。 我的主要小部件布局中有一个容器,我想在列表中动态添加新行。 为此,我在容器的 RemoteViews 上使用 addView 方法:
Widget.java
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
for (int i = 0; i < 10; i++) {
RemoteViews rowView = new RemoteViews(context.getPackageName(), R.layout.row);
views.addView(R.id.list_container, rowView);
}
行.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/row"
android:layout_width="match_parent"
android:layout_height="20dp"
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android">
</LinearLayout>
widget.xml
...
<LinearLayout
android:id="@+id/list_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
...
所以现在,我有一个 10 行/行布局副本的布局。 但是每一行都有相同的 id,具体取决于我放在 layout/row.xml 中的那个。
我现在想删除一行,因为所有行都有相同的 id,我该怎么做?
-
我无法更改行的 id,因为 RemoteViews 似乎不接受 setId(id) 方法
-
删除所有未按预期工作的视图:
views.removeAllViews(R.id.row);
- 它只删除第一行。
有人知道这是如何工作的吗?也许我这样做是错误的方式或小部件布局不是以编程方式定义的?
【问题讨论】:
-
如何为每一行动态设置不同的ID
-
我没有找到如何实现这一点,因为 setId() 不是 RemoteViews 的方法。我正在开发一个小部件,所以我必须使用 RemoteViews,而不是 Views!
-
所以,RemoveViews 不是 Views .. 你想怎么做
views.addView(R.id.list_container, rowView).. Check here -
您是否正在对该小部件进行部分更新?还是您每次都进行全面更新?如果是后者,那么您只需要以相同的方式重建
RemoteViews,但不包含已删除的项目。 -
顺便说一句,
removeAllViews()正在正常工作。这并不意味着删除所有具有给定 ID 的Views。它会删除您传递给它的Views inside;即,它相当于((ViewGroup) findViewById(R.id.row)).removeAllViews()。基本上,您的removeAllViews(R.id.row)调用清空了第一行,但留下了LinearLayout,这就是其他行不会向上移动的原因。仅供参考。
标签: android android-widget dynamically-generated remoteview