从 Widget AppWidgetProvider 内部访问布局项

2023-12-24

我开始疯狂地试图弄清楚这一点。看起来应该很容易,我开始怀疑是否可能。

我想做的是创建一个主屏幕小部件,仅包含一个 ImageButton。 当按下它时,想法是更改一些设置(例如 Wi-Fi 切换),然后更改按钮图像。

我在 main.xml 中声明了 ImageButton

<ImageButton android:id="@+id/buttonOne"
        android:src="@drawable/button_normal_ringer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

我的 AppWidgetProvider 类,名为 ButtonWidget

*** 请注意,RemoteViews 类是本地存储的变量。这使我能够访问 RViews 布局元素......或者我是这么认为的。

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

    remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.main);

    Intent active = new Intent(context, ButtonWidget.class);
    active.setAction(VIBRATE_UPDATE);
    active.putExtra("msg","TESTING");
    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context,
            0, active, 0);
    remoteViews.setOnClickPendingIntent(R.id.buttonOne,
            actionPendingIntent);

    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);


}

@Override
public void onReceive(Context context, Intent intent) {

    // v1.5 fix that doesn't call onDelete Action
    final String action = intent.getAction();
    Log.d("onReceive",action);
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
        final int appWidgetId = intent.getExtras().getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);
        if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
            this.onDeleted(context, new int[] { appWidgetId });
        }
    } else {
        // check, if our Action was called
        if (intent.getAction().equals(VIBRATE_UPDATE)) {
            String msg = "null";
            try {
                msg = intent.getStringExtra("msg");
            } catch (NullPointerException e) {
                Log.e("Error", "msg = null");
            }
            Log.d("onReceive",msg);
            if(remoteViews != null){

                Log.d("onReceive",""+remoteViews.getLayoutId());
                remoteViews.setImageViewResource(R.id.buttonOne, R.drawable.button_pressed_ringer);

                Log.d("onReceive", "tried to switch");
            }
            else{
                Log.d("F!", "--naughty language used here!!!--");
            }
        }
        super.onReceive(context, intent);
    }
}

所以,我一直在测试这个,并且 onReceive 方法效果很好,我能够发送通知和各种东西(从代码中删除以便于阅读)

我不能做的一件事是更改视图元素的任何属性。

为了尝试解决这个问题,我将 RemoteViews 设置为本地静态私有变量。使用日志,我可以看到,当屏幕上显示应用程序的多个实例时,它们都引用 RemoteViews 的一个实例。非常适合我想做的事情

麻烦在于尝试更改 ImageButton 的图像。

我可以使用此方法在 onUpdate 方法中执行此操作。

remoteViews.setImageViewResource(R.id.buttonOne, R.drawable.button_pressed_ringer);

一旦创建了小部件,这对我没有任何好处。 由于某种原因,即使它位于同一个类中,位于 onReceive 方法内部也会使该行不起作用。

事实上,该行曾经抛出一个空指针,直到我将变量更改为静态。现在它通过了空测试,引用了与开始时相同的layoutId,读取了该行,但它什么也不做。

就像代码根本不存在一样,只是一直在运行。

SO......

创建小部件后,有什么方法可以在小部件内修改布局元素!? 我想根据环境来执行此操作,而不是通过配置活动启动。

我一直在研究各种问题,这似乎是一个真正尚未解决的问题,例如链接文本 https://stackoverflow.com/questions/2181588/whats-the-proper-way-to-implement-an-android-widget-with-dynamically-drawn-conte and 链接文本 https://stackoverflow.com/questions/1977017/changing-a-widgets-icon-from-onupdate

哦,对于任何发现此内容并想要一个良好的小部件入门教程的人来说,这很容易遵循(虽然有点旧,但它让您对小部件感到满意).pdf链接文本 http://www.helloandroid.com/files/xmaswidget/android_howto-hellowidget.pdf

希望有人可以在这里提供帮助。我有点感觉这是非法的,并且有不同的方法可以解决这个问题。我很想知道另一种方法!!!!

Thanks


您可以使用另一种布局重绘屏幕,仅修改 ImageButton。这听起来像是一个黑客解决方案,但它对我有用。

// Your appWidgetProvider class should track which layout it's currently on
private static int layoutId;

// onReceive should be something like this
@Override
public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();

    if (bundle != null) {
        int newLayoutId = bundle.getInt("layout_id");
        // Change the current layout id to the layout id contained in the bundle
        layoutId = newLayoutId;
        initViews(context);
    } else {
        initViews(context);
    }
}

// Initialize the view according to the chosen layout
private void initViews(Context context) {
    RemoteViews views = null;

    // Set the initial layout   
    if (layoutId == 0) {
        Intent layoutIntent = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
        Bundle layoutBundle = new Bundle();

        // I put in the layoutId of the next layout. Note that the layoutId is not
        // from R. I just made up some easy to remember number for my layoutId
        layoutBundle.putInt("layout_id", 1);

        PendingIntent lPendingIntent = PendingIntent.getBroadcast(context, 0,
                layoutIntent, PendingIntent.FLAG_ONE_SHOT);

        // Set the layout to the first layout
        views = new RemoteViews(context.getPackageName(), R.layout.layout_zero);

        // I used buttons to trigger a layout change
        views.setOnClickPendingIntent(R.id.btnNext, lPendingIntent);
    } // Else if there's some trigger to change the layout...
    else if (layoutId == 1) {
        Intent layoutIntent = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
        Bundle layoutBundle = new Bundle();

        // Since I only have two layouts, I put here the id of the previous layout
        layoutBundle.putInt("layout_id", 0);

        PendingIntent lPendingIntent = PendingIntent.getBroadcast(context, 0,
                layoutIntent, PendingIntent.FLAG_ONE_SHOT);

        // Set the layout to the second layout
        // This layout should be almost the same as the first layout except for the
        // part that you want to change
        views = new RemoteViews(context.getPackageName(), R.layout.layout_one);
        views.setOnClickPendingIntent(R.id.btnPrev, lPendingIntent);
    }
}

如您所见,我使用了两种不同的布局,用户可以通过单击按钮进行切换。您可以根据需要使用不同的触发器来更改布局。可以找到类似的解决方案链接文本 http://www.dreamincode.net/forums/topic/144432-android-change-widget-layout-dynamically/。请原谅我将代码放在 onReceive 而不是 onUpdate :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Widget AppWidgetProvider 内部访问布局项 的相关文章

  • ACTION_VIEW 的 Intent.createChooser 仅显示默认浏览器

    我正在尝试使用 Intent createChooser 显示应用程序选择器对话框 该对话框将列出用户手机中所有可用的网络浏览器 我正在使用下面的代码 Intent browserIntent new Intent Intent ACTIO
  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • 在 Android 中的活动、服务和应用程序之间传递变量

    有人可以给我提供以下活动 服务 应用程序组合的示例吗 我拥有这三个 但我已经把我的应用程序弄得一团糟 试图在这个地方传递一堆变量 现在我不知道发生了什么 请注意 我是 Android 新手 最近我一直在努力解决这个问题 因为有很多方法可以实
  • android 谷歌+登录定制

    我正在创建一个 Android 应用程序 现在我正在实现社交网络登录 Facebook 按钮很好 但 google 按钮的语言与 Facebook 不同 另外 它只说 登录 我想让它说 用谷歌登录 我是 android 编程的新手 看到我需
  • 如何编辑 gradle 依赖项

    我正在开发一个 android 项目 该项目在我的 gradle 文件中使用以下依赖项 compile com mapzen on the road 1 1 1 我想编辑其中一个文件 以添加一些缺少的功能并为该项目做出贡献 如何下载该项目并
  • 将标题设置为操作栏时出现空指针异常

    Error Caused by java lang NullPointerException Attempt to invoke virtual method void android app ActionBar setTitle java
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • 如何在照片删除后刷新 Android 的 MediaStore

    问题 如何使媒体存储刷新其已删除文件的条目 从外部存储中删除代码中的照片后 我仍然在图库中看到已删除照片的插槽 空白照片 画廊似乎反映了媒体存储 并且在媒体存储中找到了已删除的照片 直到手机重新启动或通常 直到重新扫描媒体为止 尝试扫描已删
  • 下载图像并显示它

    应用程序的主要目的是下载和显示图像 但是当我尝试启动应用程序时它崩溃了 这是我的代码 private DownloadImageTask task protected void onCreate Bundle savedInstanceSt
  • 6:需要显示BuyFlow UI

    There is a problem when i am click on payWithGoogle Button I am implementing Google Pay in my Android Application and wh
  • 如何覆盖日期选择器的高度和宽度以填充父布局

    我有一个活动包含一个日期选择器 我想设置DatePicker适合屏幕 我试过这个答案 https stackoverflow com questions 6674667 how to customize date pickers width
  • 版本 5 上带有 getBackground().setAlpha 的按钮 - 棒棒糖无法正常工作

    我有这段代码 适用于自 API 14 以来的每个版本 但在 Android 5 0 Lollipop 上无法正常工作 以下是我希望按钮出现的方式 单击按钮1 buttonArrivals getBackground setAlpha 180
  • 有没有办法在Android上创建一个三角形按钮?

    有没有办法创建一个三角形的按钮 我知道我可以将三角形图像作为背景 但这将使三角形之外的区域可单击 有没有办法固定按钮角 X 和 Y 以便我可以将其变成三角形 您可以覆盖OnTouch http developer android com r
  • onTouchEvent()中如何区分移动和点击?

    在我的应用程序中 我需要处理移动和单击事件 一次点击是由一个 ACTION DOWN 操作 多个 ACTION MOVE 操作和一个 ACTION UP 操作组成的序列 理论上 如果您收到 ACTION DOWN 事件 然后收到 ACTIO
  • 更改android中禁用按钮的颜色

    有没有办法通过样式或其他形式更改 android 中禁用按钮的颜色 我目前有以下内容 可绘制 button default xml
  • 如何在新标签 android webview 中打开链接? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经使用 webview 创建了一个 android 应用程序来显示我的网站 我什至想添加在新选项卡中打开链接的功能 但我找不到任何
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • gradle-experimental:0.1.0 buildConfigField

    谁知道怎么定义buildConfigField在实验性的 gradle 插件中 android productFlavors create demo applicationId com anthonymandra rawdroid buil
  • 使用支持库中的 BottomSheet 时如何调暗背景?

    怎样才能让背景像显示的那样变暗here https material design storage googleapis com publish material v 8 material ext publish 0Bzhp5Z4wHba3
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • 如何从 scala/sbt/slf4j 项目中排除公共日志记录?

    我的 scala sbt 项目使用 grizzled slf4j 和 logback 第三方依赖项使用 Apache Commons Logging 对于 Java Maven 我将使用 jcl over slf4j 和 logback c
  • Android XML:投影被截断

    我有一个带有边距的相对布局和一个嵌套在该布局内的浮动操作按钮
  • 如何正确处理 ASP.Net Core 3 Web API 中的多个端点

    我有 2 种方法来处理 HTTP GET 请求 第一个方法用于int键入输入 另一个用于string类型输入 GET api Fighters 5 HttpGet id public async Task
  • 如果我在 MySQL 中存储 int(255) ,最大数量是多少?

    我在mysql中使用int 255 作为我的id 这够长吗 如果我有大约 1 000 000 条记录 谢谢 有些东西可能只是将其转换为int 11 为你 因为你不能在一个字符中包含 255 个可见数字int 最大值将为2147483647
  • 在 asp.net mvc 2.0 中使用 Html.DropDownListFor 助手时如何更改 id 值?

    我有这样的部分观点 现在您可以创建新产品并编辑现有产品 编辑和创建都使用相同的形式 加载时创建位于主页上 编辑会在 jQuery UI 模型对话框中弹出并呈现新的部分视图 因此 就页面而言 我有两个具有相同 id 的下拉框 这很糟糕 因为它
  • 向下滚动到页面图像时是否能够部分加载页面图像,或者只是效果?

    我在一些网站上注意到 例如http mashable com http mashable com当您打开页面并尝试滚动它时 它似乎在您到达它时加载图像 我不知道这是否只是闪烁效果 或者它确实是为了减少滚动到它之前的图像负载 这是一个帮助您入
  • Hbase-hadoop集成中datanode、regionserver的作用

    根据我的理解 行被插入到 HBase 表中 并作为区域存储在不同的区域服务器中 因此 区域服务器存储数据 类似地 就 Hadoop 而言 数据存储在 hadoop 集群中的数据节点中 假设我在 Hadoop 1 1 1 之上配置了 HBas
  • 仅当安装支持 Android 应用程序时 HTML 重定向到自定义协议

    我想让所有用于我的应用程序的 URI 启动我的应用程序 如果已安装 如果未安装 我想显示有关我的应用程序的网页 看了下面两个问题 还是找不到靠谱的解决办法 意图过滤器适用于 Google 但不适用于 Chrome 和 Facebook ht
  • Flask jsonify 在新行上打印结果

    第一次使用 Flask 我创建了一个非常基本的应用程序 我正在尝试打印推荐系统的结果 第一组代码来自我的 python 函数 print most similar 正在创建一个格式化字符串 希望在新行上打印每个 REC 代码的第二部分显然是
  • 如何将不同的输入放入 sklearn Pipeline 中?

    我正在使用 sklearn 的 Pipeline 对文本进行分类 在此示例管道中 我有一个 TfIDF 矢量器和一些用 FeatureUnion 包装的自定义功能和分类器作为管道步骤 然后我拟合训练数据并进行预测 from sklearn
  • LUA_MULTRET 未按预期工作

    This is almost的副本这个问题 https stackoverflow com questions 12528820 lual dostring puts nothing on the stack 但是 答案表明并不能解决我的问
  • 如何在单元测试中模拟JPA存储库的find方法

    我正在尝试 UT 我的小项目 但遇到了问题 我的应用程序使用简单的分层架构 我不能碰巧UT服务层 事实上我想嘲笑班级Crud存储库 https docs spring io spring data commons docs current
  • 错误参考错误:“ng build”时“缓冲区未定义”

    我正在尝试在我的角度组件 ts 中使用 Buffer 来编码授权字符串 它没有编译ng build 我试过npm i types node并将 node 添加到 tsconfig json 中的 types 字段 但错误仍然存 在 以下是错
  • 带参数的 Scala 传递函数

    将一个函数传递给另一个函数的 Scala 示例缺少传递的函数 timeFlies 采用参数 x 的情况 object Timer def oncePerSecond callback Int gt Unit while true callb
  • 如何在 Java 中实例化一组映射?

    我可以使用泛型声明映射数组来指定映射类型 private Map
  • 如何在 SQLPLUS 中执行 SQL 脚本期间回显文本

    我有一个批处理文件 它在 sqlplus 中运行 SQL 脚本并将输出发送到日志文件 sqlplus user pw RowCount log 我的日志文件包含以下内容 Connected to Oracle Database 11g Ex
  • 将数据写入plist

    我想从 plist 读取数据 添加一些元素并将数据写入 plist 更新 plist 我想让 plist 保存一个字典数组 将该数组读入我的应用程序 添加字典 然后将数组写回 plist 这是怎么做到的 我也不确定在应用程序首次启动时在哪里
  • Tensorflow 与 Numpy 数学函数

    numpy 和tensorflow 执行的数学函数之间有什么真正的区别吗 例如 指数函数 还是最大值函数 我注意到的唯一区别是张量流接受张量的输入 而不是 numpy 数组 这是函数结果中唯一的区别 并且按值没有区别吗 正如已经提到的 存在
  • 将 Woocommerce 添加到购物车按钮添加到相关产品和产品列表

    我在向 WooCommerce 添加其他内容时遇到一些困难 因为我对它还是新手 我正在尝试向相关产品和产品列表添加 添加到购物车 按钮 正在运行代码并卡在下面 a href a
  • 从 Widget AppWidgetProvider 内部访问布局项

    我开始疯狂地试图弄清楚这一点 看起来应该很容易 我开始怀疑是否可能 我想做的是创建一个主屏幕小部件 仅包含一个 ImageButton 当按下它时 想法是更改一些设置 例如 Wi Fi 切换 然后更改按钮图像 我在 main xml 中声明