在小部件(RemoteViews)中更改GridView的numColumns没有效果

6

我有一个包含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方法没有效果,其他方法调用也是如此。 我做错了什么?


请接受下面的答案,如果它解决了你的问题。 - j__m
3个回答

3

你只能调用带有@android.view.RemotableViewMethod注释的方法来操作RemoteViews视图。对于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) {

您可以亲自验证这一点: https://android.googlesource.com/platform/frameworks/base/+/jb-release/core/java/android/widget/GridView.java 该链接是关于Android平台下的GridView控件的Java代码。

3

我正在尝试自己找到答案。

目前我发现的唯一方法是更改初始的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);

这样做虽然可行,但我认为它的编写和运行效率都不高。不过,它确实能够工作。

0

虽然来晚了,但还是...

我通过定义具有最大可能应用程序列数(即10)的GridLayout来解决了这个问题。

我让用户定义他想要看到多少列(即3)。

当我填充GridLayout时,我设置与用户设置的一样多的实际按钮,在其他列中,我只设置填充按钮并将它们隐藏起来。当一行中的所有列都被填满后,我再次开始设置实际按钮。

以下是代码...请注意appWidgetCols和buttonsInRow变量。

  @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);
    }
  }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接