我有一个带有 GridView 的小部件(可以使用),它以 1 列或多行显示信息。 我想以编程方式设置列数,因为用户应该选择。如果我将 Layout-XML 中的 numColumns 设置为“1”,它就可以正常工作。 如果我尝试按以下方式设置 numColumns,则没有效果:
rViews.setInt(R.id.duration_view, "setNumColumns", 1);
布局如下:
<GridView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/duration_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minHeight="64dp"
android:verticalSpacing="0dp"
android:columnWidth="192dp"
android:numColumns="auto_fit"
/>
我的小部件 onUpdate() 方法,使用 RemoteAdapter:
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// ....
Intent intent = new Intent(context, ViewFlipperWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews rViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
rViews.setRemoteAdapter(R.id.duration_view, intent);
rViews.setEmptyView(R.id.duration_view, R.id.empty_view);
// This doesnt have any effect...:-(
rViews.setInt(R.id.duration_view, "setNumColumns", 1);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.duration_view);
AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, rViews);
// ....
super.onUpdate(context, appWidgetManager, appWidgetIds);
不仅setNumColumns没有效果,其他方法调用也没有效果。 我做错了什么?
您可以针对
RemoteViews
视图调用的唯一方法是带有 @android.view.RemotableViewMethod
注释的方法。 GridView 只有三种这样的方法:
@android.view.RemotableViewMethod
public void setRemoteViewsAdapter(Intent intent) {
@android.view.RemotableViewMethod
public void smoothScrollToPosition(int position) {
@android.view.RemotableViewMethod
public void smoothScrollByOffset(int offset) {
您可以自行验证:
我正在尝试自己寻找这个答案。
到目前为止,我发现的唯一方法是更改初始 RemoteViews 对象,为每个列数量使用不同的资源:
RemoteViews rViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout_1_column);
或
RemoteViews rViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout_3_columns);
这可行,但我无法想象它对于代码或运行来说是高效的。但话又说回来,它是如此有效......
参加聚会已经很晚了,但仍然......
我通过在应用程序中使用columnCount = max可能定义GridLayout解决了这个问题。 (即10)。
我让用户定义他想看到多少列。 (即 3)。
当我填充 GridLayout 时,我设置了用户设置的尽可能多的真实按钮,在其他列中我只设置了填充按钮并隐藏了它们。 当一行中的所有列都被填充时,我再次开始设置真正的按钮。
这是代码...注意 appWidgetCols 和 ButtonInRow 变量。
@Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
super.onUpdate(context, appWidgetManager, appWidgetIds);
for (int appWidgetId : appWidgetIds) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.novawidgets_widget);
SharedPref sp = new SharedPref(context);
String widgetsAllCache = sp.getString("widgets_all_cache");
DoorWidgets.WidgetsAllMap widgetsAll = new DoorWidgets.WidgetsAllMap();
if (!"".equals(widgetsAllCache))
widgetsAll = Json.fromJson(widgetsAllCache, DoorWidgets.WidgetsAllMap.class);
String appWidgetHwIds = sp.getString("appwidget_hwids");
int appWidgetCols = sp.getInt("appwidget_cols");
if (appWidgetCols == 0)
appWidgetCols = 2;
views.removeAllViews(R.id.widget_buttons_container);
int buttonsInRow = 0;
RemoteViews btn;
if (widgetsAll != null) {
for (String hwId : appWidgetHwIds.split(",")) {
if (widgetsAll.containsKey(hwId)) {
while (buttonsInRow >= appWidgetCols) {
btn = new RemoteViews(context.getPackageName(), R.layout.novawidgets_button);
btn.setViewVisibility(R.id.widget_button_container, GONE);
views.addView(R.id.widget_buttons_container, btn);
buttonsInRow++;
if (buttonsInRow >= 10)
buttonsInRow = 0;
}
WidgetCache widget = widgetsAll.get(hwId);
assert widget != null;
btn = new RemoteViews(context.getPackageName(), R.layout.novawidgets_button);
btn.setImageViewResource(R.id.widget_button,
widget.type == DOOR ? R.drawable.door_closed_vector : R.drawable.ic_light_vector);
btn.setTextViewText(R.id.widget_name, widget.hwName);
views.addView(R.id.widget_buttons_container, btn);
buttonsInRow++;
}
}
}
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
超级死灵,但是
rViews.setInt(R.id.duration_view, "setNumColumns", 1);
在 2024 对我有用。在 Android 12 上测试。