gpt4 book ai didi

java - Android Widget - 单击按钮时更新

转载 作者:行者123 更新时间:2023-11-30 04:58:40 27 4
gpt4 key购买 nike

美好的一天。我正在尝试创建一个将在屏幕上显示余额的小部件。创建了 2 个按钮并设置监听器以确定按下了哪个按钮。

难度:如何通过点击按钮或重新加载小部件来更新数据以便更新数据?

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.DateFormat;
import java.util.Date;

public class EthWidgetProvider extends AppWidgetProvider {
private static final String SYNC_CLICKED = "automaticWidgetSyncButtonClick";
private static final String SYNC_CLICKED2 = "automaticWidgetSyncButtonClick2";


static void updateAppWidget(final Context context, final AppWidgetManager appWidgetManager, final int appWidgetId) {
RequestSingleton.getInstance(context).fetchData(new VolleyCallback() {
@Override
public void onSuccessRequest(JSONArray result) {
Log.i("Response", result.toString());
String price = "";
try {
JSONObject etherObject = result.getJSONObject(0);
price = etherObject.getString("price_usd");
} catch (JSONException e) {
Log.e("JSONException", e.toString());
}
Log.i("Price", price);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_widget);
views.setTextViewText(R.id.gprs, "$" + price);

String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
views.setTextViewText(R.id.timeofday, currentDateTimeString);

appWidgetManager.updateAppWidget(appWidgetId, views);
}
});
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {


RemoteViews remoteViews;
ComponentName watchWidget;

remoteViews = new RemoteViews(context.getPackageName(), R.layout.example_widget);
watchWidget = new ComponentName(context, EthWidgetProvider.class);

remoteViews.setOnClickPendingIntent(R.id.refresh, getPendingSelfIntent(context, SYNC_CLICKED));
remoteViews.setOnClickPendingIntent(R.id.example_widget_button, getPendingSelfIntent(context, SYNC_CLICKED2));
appWidgetManager.updateAppWidget(watchWidget, remoteViews);

for(int appId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appId);
}
}

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);

if (SYNC_CLICKED.equals(intent.getAction())) {

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

RemoteViews remoteViews;
ComponentName watchWidget;

remoteViews = new RemoteViews(context.getPackageName(), R.layout.example_widget);
watchWidget = new ComponentName(context, EthWidgetProvider.class);

remoteViews.setTextViewText(R.id.timeofday, "TESTING");

appWidgetManager.updateAppWidget(watchWidget, remoteViews);

}

if (SYNC_CLICKED2.equals(intent.getAction())) {

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

RemoteViews remoteViews;
ComponentName watchWidget;

remoteViews = new RemoteViews(context.getPackageName(), R.layout.example_widget);
watchWidget = new ComponentName(context, EthWidgetProvider.class);

remoteViews.setTextViewText(R.id.timeofday, "TESTING2");

appWidgetManager.updateAppWidget(watchWidget, remoteViews);

}
}

protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
}

按下按钮 1,我需要显示 Activity 。通过按下第二个按钮,您需要更新小部件以便更新数据,即再次向服务器发出请求并更新数据。

如有任何帮助,我们将不胜感激。

最佳答案

我不明白你对广播的看法。

  1. 广播不应该是内部类
  2. Broadcast 应该继承 BroadcastReceiver 类
  3. 广播应该在 list 中定义

所以当你这样做时,你的接收器应该在点击按钮后被调用。

但是,您需要一些东西来唤醒您的 Widget。然后 Widget#onUpdate 将获取更新的数据(您在点击小部件时下载)并显示它们。要请求更新您的小部件,您可以使用如下内容:

public static void updateAppWidget(@NonNull Context applicationContext,
@NonNull Class<? extends AppWidgetProvider> widgetProviderClass) {
final ComponentName component = new ComponentName(applicationContext, widgetProviderClass);
final int[] widgetIds;
try {
widgetIds = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(component);
} catch (RuntimeException re) {
Log.d(re, "Unable to obtain widget IDs.");
return;
}

if (widgetIds.length == 0) {
Log.d("There is no widget to be updated.");
return;
}

final Intent intent = new Intent(applicationContext, widgetProviderClass);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);

applicationContext.sendBroadcast(intent);
}

总结一下:

  • 在小部件设置 View 、监听器中,并填充最后已知的数据。
  • 在监听广播中打开 Activity,或者运行一些下载
  • 不要忘记 BroadcastReceivers 在 UI 线程上运行;使用goAsync() 方法。
  • 下载的数据应该存储到某个地方,小部件可以在那里获得它们
  • 调用提到的函数来触发小部件更新。

我相信,与 Android 的其他部分不同,这是一个非常具体和复杂的主题,所以请尽管问我可能遗漏的任何问题 :)

关于java - Android Widget - 单击按钮时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58659229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com