Android 简单的 imageView 小部件

Posted

技术标签:

【中文标题】Android 简单的 imageView 小部件【英文标题】:Android Simple imageView Widget 【发布时间】:2017-11-13 01:16:06 【问题描述】:

我正在尝试制作一个仅包含一个 imageView 的小部件,当您点击它时,它会变为另一张图片,从我制作的六张图片中随机选择。

我的问题是,对于如何制作小部件没有很好的解释,所以我不知道该怎么做。

我已经做了一个小部件布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/relativeLayout"
    android:layout_
    android:layout_
    android:padding="@dimen/widget_margin">

    <ImageView
        android:id="@+id/imageView"
        android:layout_
        android:layout_
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:adjustViewBounds="true"
        android:clickable="true"
        android:contentDescription="@string/widget_description"
        android:onClick="widgetOnClick"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.5"
        app:srcCompat="@mipmap/ic_widget" />
</LinearLayout>

我尝试在我的 .java 文件中编写一些代码,但没有任何作用。

package com.ggblbl.widget;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.RemoteViews;

import java.util.Random;

/**
 * Implementation of App Widget functionality.
 */
public class RandomSideWidget extends AppWidgetProvider 

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) 

        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.random_side_widget);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
        // There may be multiple widgets active, so update all of them
        for (int appWidgetId : appWidgetIds) 
            updateAppWidget(context, appWidgetManager, appWidgetId);
        
    

    @Override
    public void onEnabled(Context context) 
        // Enter relevant functionality for when the first widget is created
    

    @Override
    public void onDisabled(Context context) 
        // Enter relevant functionality for when the last widget is disabled
    

    public void widgetOnClick(View v) 
        ImageView imageView = (ImageView) v.findViewById(R.id.imageView);
        Random rnd = new Random();
        int number = rnd.nextInt(6) + 1;

        switch(number) 
            case 1:
                imageView.setImageResource(R.drawable.widget_blue);
                break;
            case 2:
                imageView.setImageResource(R.drawable.widget_green);
                break;
            case 3:
                imageView.setImageResource(R.drawable.widget_orange);
                break;
            case 4:
                imageView.setImageResource(R.drawable.widget_pink);
                break;
            case 5:
                imageView.setImageResource(R.drawable.widget_red);
                break;
            case 6:
                imageView.setImageResource(R.drawable.widget_yellow);
                break;
            default:
                imageView.setImageResource(R.mipmap.ic_widget);
                break;
        
    

我使用 API 级别 15。

【问题讨论】:

developer page on App Widgets 比较详细。你经历过吗? 我确实试过了(多次),是的,但我不太明白。 【参考方案1】:

您应该使用 PendingIntent 和 IntentService 来处理来自小部件的点击。 在updateAppWidget()方法里面,代码如下:

Intent intent = new Intent(context, MyIntentService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 1001 + appWidgetId, intent, 0);
views.setOnClickPendingIntent(R.id.imageView, pendingIntent);

将您的 onclick 内容放在扩展 IntentService 的自定义类的 onHandleIntent 方法中。

在更新完成后也调用相同的方法updateAppWidget()

【讨论】:

整个问题是我不知道在那里和布局文件中编码什么。 创建IntentService,右键java>new>Service>Service(IntentService),不用担心编辑manifest。 @ggblbl 在 IntentService 的 onHandleIntent() 方法中编写点击处理代码。 现在我在 setImageResource 案例中遇到了这些错误:`方法 setImageResource 必须从 UI 线程调用,当前推断的线程是 workerless... (Ctrl+F1) 此检查着眼于 Android API 调用已使用各种支持注释(例如 RequiresPermission 或 UiThread)进行注释,并标记任何未按照注释指定的正确使用 API 的调用。此检查标记的错误示例:将错误类型的资源整数(例如 R.string)传递给需要不同类型的 API(例如 R.dimen)。 忘记在需要它的方法中调用被覆盖的方法(通过 super)调用需要权限的方法而没有在清单中声明该权限将资源颜色引用传递给需要 RGB 的方法整数值。 ...还有很多。有关更多信息,请参阅developer.android.com/tools/debugging/annotations.html` 上的文档【参考方案2】:

你可以简单地使用

views.setImageViewResource(R.id.YOUR_IMAGEVIEW_ID,R.drawable.YOUR_IMAGE);

而不是

imageView.setImageResource(R.drawable.widget_blue);

【讨论】:

以上是关于Android 简单的 imageView 小部件的主要内容,如果未能解决你的问题,请参考以下文章

将 URL 中的 ImageView 加载到主屏幕小部件的 RemoteView 中

Android:可点击的图像视图小部件

Android Widget ImageView 不显示

旋转 ImageView [重复]

无法在 RemoteView Android 上更改 ImageView 资源

带有 MultiTouch 的 Android 图库适配器?自定义图库还是自定义 ImageView?