当前位置: 首页 > 知识库问答 >
问题:

android小部件中的TextView不更新

乌靖
2023-03-14
<receiver android:name=".WidgetProvider" android:label="@string/app_name" android:exported="false">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>

    <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" />
</receiver>
package com.example.huskeliste;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class WidgetProvider extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        for (int i = 0; i < N; i++) {
            int widgetId = appWidgetIds[i];

            DBAdapter info = new DBAdapter(context);

            info.open();
            String data = info.getTextViewData();
            info.close();

            Intent intent = new Intent(context, Main.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
            views.setOnClickPendingIntent(R.id.loWidget, pendingIntent);
            views.setTextViewText(R.id.txtView, data);
            appWidgetManager.updateAppWidget(widgetId, views);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="1800000">
</appwidget-provider>

layout-widget.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loWidget"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:gravity="center"
    android:layout_margin="1dp"
    android:background="@drawable/background">

    <TextView
        android:id="@+id/txtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="22dp"
        android:textColor="#ffffff"
        android:text="" />
</LinearLayout>

background.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient android:startColor="#CC111111" android:endColor="#CC111111" android:angle="0" />
    <padding android:left="4dp" android:top="1dp" android:right="4dp" android:bottom="1dp" />
    <corners android:radius="3dp" />
</shape>

来自DbAdapter.java的getTextViewData():

public String getTextViewData() {
    String[] columns = new String[] { KEY_NAME };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    String result = "";

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {           
        if (result.length() > 0) {
            result += ", ";
        }

        result += c.getString(0);
    }

    return result;
}

有人知道我的代码中缺少了什么吗?

共有1个答案

梁丘飞鸾
2023-03-14

您需要在小部件提供程序XML内部设置一个以毫秒为单位的更新间隔。示例代码:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen|keyguard"
    android:initialKeyguardLayout="@layout/example_keyguard">
</appwidget-provider>

但是,您应该知道,系统并不保证小部件经常更新。此外,如果您希望小部件更频繁地更新(例如,在配置更改之后,就像您的问题一样),则需要手动进行更新。下面是我的操作方式:

在本例中,我的小部件类被简单地称为Widget.class:

public class Widget extends AppWidgetProvider {

    // TODO: Don't forget to override the onUpdate method also

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("update_widget")) {
            // Manual or automatic widget update started

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

            // Update text, images, whatever - here
            remoteViews.setTextViewText(R.id.yourTextID, "My updated text");

            // Trigger widget layout update
            AppWidgetManager.getInstance(context).updateAppWidget(
                    new ComponentName(context, Widget.class), remoteViews);
        }
    }

}
Intent updateWidget = new Intent(context, Widget.class); // Widget.class is your widget class
updateWidget.setAction("update_widget");
PendingIntent pending = PendingIntent.getBroadcast(context, 0, updateWidget, PendingIntent.FLAG_CANCEL_CURRENT);
pending.send();
 类似资料:
  • 问题内容: 我有一个非常烦人的问题: 在我的小部件中,我想通过代码更改背景。我在Google文档上注意到,我可以轻松更改Imageview的背景: 好的,太容易了,我现在想更改线性布局。我所读到的有关remoteview ID的信息是,我可以更改位图,整数,布尔,字符串等,但是不能绘制。所以我想我不能使用: 我完全失望,并尝试了最后一个主意: 但是logcat告诉我: android.widget

  • 问题内容: 下面显示的是我班的简化版本。我在onReceive方法上遇到了麻烦,该方法没有更新小部件TextView。它在logcat中显示正确的信息,该信息在setTextViewText之前的行上输出。我不确定出什么问题了,并且一直在拔头发(而且我已经秃顶了)。 } 问题答案: 找到了答案。调用后,您需要通过调用来更新窗口小部件。我添加的代码如下所示。

  • 问题内容: 因此,我的标签页布局如Android示例所示: 现在,在选项卡的活动之一中,我声明了一个按钮,并希望引入一个新视图。如果我创建一个新的意图,它将推送一个新的视图,并且选项卡都消失了。是否可以用新视图切换当前选择的视图? 问题答案: 是的,这很有可能..为此,您必须使用ActivityGroup。 而不是向TabHost添加活动。您必须添加ActivityGroup。每个活动组都有其活动

  • 问题内容: 应用程序正在运行,但此处未得到更新是相关代码。 activity_picker_dashboard.xml 这是layout_header.xml 这是我的模型ProfileResponse.java 最后是我的活动 请提出解决方案。我已经尝试了一段时间了。PS:我也在用黄油刀。 问题答案: 问题在于如何将数据绑定布局与常规布局混合在一起。 如果要包括常规布局中的数据绑定布局,则需要找

  • 问题内容: 在MainActivity中,我有一个TextView:textV1。我在MainActivity中也有一个更新该textview的方法: 在BroadcasrReceiver中,我需要在MainActivity中更新textV1中的文本。 如何才能做到这一点?BroadcastReceiver从服务运行。我无法更改此代码。我可以从onReceive()访问和更改MainActivit

  • 该片段不是MainActivity的一部分,而是在Activities onCreate()方法中加载到活动的FrameLayout中。 主体活动 FactFragment 接口