标签: android-appwidget

Android AppWidgetManager方法updateAppWidget无法设置意图,加载数据.它随机发生

我的小部件由2个按钮和一个显示数据的列表视图组成.大多数情况下,当调用窗口小部件提供程序的onUpdate方法时,一切都正常加载,每个人都很高兴.

但是我注意到有时在调用update方法之后,widget完全无法加载其数据.列表视图为空,并且所有按钮都没有响应.就像我将布局初始化到窗口小部件中一样,但没有设置挂起的意图和列表的适配器.

我记录了一切,发现事实并非如此.每次都会创建挂起的意图,以及列表适配器,包括失败时的随机时间.很长一段时间以来,我认为它与列表数据如何填充到适配器中有关,但每次都看到它工作,再加上按钮意图不能正常工作的事实让我相信方法updateAppWidget (ComponentName,RemoteViews)是失败的.但是,没有错误堆栈可以帮助我确认这一点.

以下是在AppWidgetProvider的onUpdate方法调用的单独服务中运行的代码:

@SuppressWarnings("deprecation")
private void updateWidget(int[] ids) {

    AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
    int[] widgetIds = widgetManager.getAppWidgetIds(new ComponentName(this, WidgetReceiver.class));

    for (int currentWidgetId : widgetIds) {

        RemoteViews widget = new RemoteViews(this.getPackageName(), R.layout.widget_layout);

        Intent intent = new Intent(this, WidgetService.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
        intent.putExtra("random", randomNumber);
        randomNumber++;
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));

        widget.setRemoteAdapter(currentWidgetId, android.R.id.list, intent);

        Intent clickIntent = new Intent(this, DetailsActivity.class);
        PendingIntent pending = PendingIntent.getActivity(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        widget.setPendingIntentTemplate(android.R.id.list, pending);

        Intent settingsIntent = new Intent(this, WidgetSettingsActivity.class);
        settingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent settingsPending = PendingIntent.getActivity(this, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        widget.setOnClickPendingIntent(R.id.widget_settings, settingsPending); …
Run Code Online (Sandbox Code Playgroud)

android android-appwidget

8
推荐指数
1
解决办法
4529
查看次数

AppWidgetHost不更新小部件

我可以AppWidgetHost在里面使用Fragment吗?我无法将大多数小部件添加到我的AppWidgetHost中进行更新.这是我的情景..

LauncherActivity.java

  • 非常简单,只需使用布局调用setContentView.

main.xml中

  • 包含一些片段,包括其中包含AppWidgetHost的片段.

CodeRedWidgetHostFragment.java

  • onCreateView
    创建AppWidgetHost和AppWidgetManager的实例
    创建并设置我的主机视图,其中包含我存储在首选项中的小部件ID

  • onStart()
    appWidgetHost.startListening()

  • onStop()
    appWidgetHost.stopListening()

当我得到AppWidgetHost和AppWidgetManager的实例时,我正在使用getActivity()来获取Fragments托管活动.我想知道这是不是我的小部件没有更新的原因?

有些小部件实际上会更新,例如模拟时钟,但是,Youtube小部件不会自动循环显示视频缩略图.

我应该提一下,我在AppWidgetHost中选择了我想要的小部件,在另一个活动中将所选小部件的id存储在SharedPreferences中.

这是我的Fragment类的代码.

package com.brockoli.android.codered.widgethost;

import android.app.Fragment;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.brockoli.android.codered.R;

public class CodeRedWidgetHostFragment extends Fragment {
private static final String TAG = CodeRedWidgetHostFragment.class.getSimpleName();

public static final String CODERED_WIDGET_ID = "CODERED_WIDGET_ID";

private SharedPreferences mSharedPrefsWidgets;

AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup …
Run Code Online (Sandbox Code Playgroud)

android host android-widget android-fragments android-appwidget

8
推荐指数
1
解决办法
1709
查看次数

在运行时期间在RemoteView中设置TextView的位置

亲爱的,我试图在appwidget中设置TextView的位置.

基本上,TextView可以直接访问属性:

myRemoteView.setTextColor(R.id.myTextView, Color.WHITE);   //works
Run Code Online (Sandbox Code Playgroud)

间接地,我可以访问TextView属性:

myRemoteView.setInt(R.id.myTextView, "setTextColor", Color.BLUE); // works
Run Code Online (Sandbox Code Playgroud)

设置浮点值也有效:

myRemoteView.setFloat(R.id.myTextView, "setTextSize", 25); // works
Run Code Online (Sandbox Code Playgroud)

现在我试图将TextView的x位置移动5个像素:

myRemoteView.setFloat(R.id.myTextView, "setTranslationX", 5); // does not work
myRemoteView.setFloat(R.id.myTextView, "setX", 5); // does not work
myRemoteView.setInt(R.id.myTextView, "setLeft", 5); // does not work
Run Code Online (Sandbox Code Playgroud)

我尝试了FrameLayout和RelativeLayout,还尝试了AbsoluteLayout(折旧).什么都行不通.但必须有办法做到这一点.你能帮忙吗?

android android-appwidget

7
推荐指数
1
解决办法
1942
查看次数

如何获取应用小部件大小?

我有一个Android应用程序小部件,我想扩展它以支持几种尺寸,并且还可以使用Honeycomb重新调整大小.

问题是我需要知道窗口小部件的大小,所以我可以知道我可以放入多少内容.

如何阅读应用小部件大小?

我找不到任何东西.

size android resize android-appwidget

7
推荐指数
1
解决办法
6935
查看次数

setCompoundDrawables与RemoteViews

我有一个带有textview和imageview的appwidget布局.

Lint总是告诉我用复合textview替换它.

问题是,如何使用RemoteViews调用setCompoundDrawables?可能吗?

谢谢.

更新: http ://code.google.com/p/android/issues/detail?id = 29249

android android-appwidget

7
推荐指数
1
解决办法
1737
查看次数

android appwidget listview没有更新

我编写了一个AppWidget,它从ContentProvider中显示ListView中的一些数据,但是我无法更新它.当我第一次创建窗口小部件时,它会正确填充,但在AlarmManager的PendingIntent到达后,ListView上不会发生更新.这是代码:

Intent update = new Intent(context, MenuWidgetProvider.class);
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pIUpdate = PendingIntent.getBroadcast(context, 0, update, 0);
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).
set(AlarmManager.RTC, nextTime.toMillis(false), pIUpdate);

Log.d(TAG, "updating: " + dmt.mealName);

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

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_menu);
    // meal name
    views.setTextViewText(R.id.widget_locname, prefs.getString(PREF_WIDGET_LOCNAME, ""));

    // adapter
    Intent adapter = new Intent(context, MenuWidgetAdapterService.class);
    adapter.putExtra(EXTRA_LOCATIONID, prefs.getInt(PREF_WIDGET_LOCID, -1));
    adapter.putExtra(EXTRA_MEALNAME, dmt.mealName);
    adapter.putExtra(EXTRA_DATE, dmt.date.toString());
    views.setRemoteAdapter(R.id.widget_list, adapter);

    // update
    manager.updateAppWidget(widgetId, views);
}

super.onUpdate(context, manager, appWidgetIds);
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当更新发生时,onUpdate()方法运行 - …

android listview widget android-appwidget

7
推荐指数
1
解决办法
3739
查看次数

使用appWidgetId检查主屏幕上是否存在小部件

我正在使用AlarmManager更新我的小部件.如果主屏幕上没有小部件,我想停止它.但我在检测主屏幕上是否没有小部件时遇到问题.

每当我尝试使用这种方式获取AppWidgetIds时:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

int[] appWidgetIDs = appWidgetManager
    .getAppWidgetIds(new ComponentName(context, Widget.class));
Run Code Online (Sandbox Code Playgroud)

我得到了一段appWidgetIDs时间实际上主屏幕上没有小部件.为什么?

因此,我想知道是否有办法检测主屏幕上是否存在小部件ID.

先谢谢你.

android android-widget android-appwidget

7
推荐指数
1
解决办法
4556
查看次数

AppWidget:在某些设备上完成配置活动后,不会显示实例

在主屏幕上添加appwidget的新实例时,我在某些设备上遇到了奇怪的行为.

我有配置活动的AppWidget应用程序.正如在appwidget的教程更新中所说,我必须自己做.

    public static void updateWidgetAndSendIntent (Activity activity, int mAppWidgetId, boolean isUpdate) {
    updateWidgets(activity);
    if (!isUpdate) {
        Intent resultIntent = new Intent();
        resultIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
        activity.setResult(Activity.RESULT_OK, resultIntent);
        activity.finish();
    }
}

    public static void updateWidgets(Context context) {
    new ManagerUpdateWidget(context).updateAllWidgetInstances();
}
Run Code Online (Sandbox Code Playgroud)

ManagerUpdateWidget.java

    public void updateAllWidgetInstances() {

    Bitmap widget = getCustomView(context);

    for (int widgetId : appWidgetIds) {
        updateCurrentInstance(widgetId, widget);
    }
}
Run Code Online (Sandbox Code Playgroud)

事实上,搭载Android 4.4.2的三星Galaxy Note 2(GT-N7100)一切都还可以,但是在搭载Android 5.0的三星Galaxy Note 3(SM-N900)上我有"幻影"appwidget,而不是真正的appawidget on主屏幕,但"幽灵",当你在屏幕上看不到appwidget但在你的应用程序appwidget内存在ID和定期更新.我已经在genymotion模拟器(Android 4.3和5.0)上测试了我的应用程序,但一切都很好.

请建议我如何解决这个奇怪的错误.

android android-appwidget

7
推荐指数
1
解决办法
131
查看次数

在棉花糖升级后,appwidget listview行不会更新或加载

我有一个小部件应用程序,没有问题Android Lollipop或较低的操作系统.当我将nexus 5升级到Marshmallow(android 6.0)时,我意识到我的小部件在加载自定义行列表视图时遇到问题.Widget有一个动态textView和一个动态listView.textView工作得很好; 但是listView行项目没有希望.当我添加小部件时,行处于加载阶段.它与Lollipop或更低版本的设备完全相同,但不适用于Marshmallow.我相信棉花糖正在引发一个我无法找到它的问题.我希望有人告诉我我做错了什么并帮助我解决这个问题.我很感激所有的帮助.谢谢.

WidgetProvider.class:

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        System.out.println("WidgetProvider.onUpdate()");

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        final boolean isMaviKart = MainUtils.getCardType(context).equals(Constants.CARD_TYPE_MAVI);

        try {
            //set widget id
            ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
            int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
            MainUtils.setWidgetID(prefs, allWidgetIds[allWidgetIds.length - 1]);

            for (int i = 0; i < appWidgetIds.length; i++) {
                Intent intentService = new Intent(context, WidgetService.class);

                intentService.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
                intentService.setData(Uri.parse(intentService.toUri(Intent.URI_INTENT_SCHEME)));

                RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget);
                widget.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intentService);

                Intent clickIntent = new Intent(context, MainActivity.class);
                PendingIntent …
Run Code Online (Sandbox Code Playgroud)

android android-widget appwidgetprovider android-appwidget android-6.0-marshmallow

7
推荐指数
1
解决办法
805
查看次数

应用程序 WIdgets 显示不一致的行为

我在 Android 中创建了一个 Appwidget,并提供了两个按钮,但我发现在与它交互的过程中,有时会调用 UPDATE 信号,有时则不会。

以下是ClockWidgetWorker的实现

class ClockWidgetWorker (pContext: Context?, pWorkerParams: WorkerParameters?) : Worker(pContext!!, pWorkerParams!!) {

companion object {

    fun getCurrentTime (pContext : Context) : String
    {
        Log.d("AppWidget", "Inside getCurrentTime")

        val views       = RemoteViews (pContext.packageName, R.layout.widget_layout)
        val sdf         = SimpleDateFormat ("HH:mm:ss", Locale.getDefault ())
        val update_time = sdf.format (Date ())

        views.setTextViewText(R.id.time_text, update_time)
        AppWidgetManager.getInstance (pContext).updateAppWidget (ComponentName (pContext, ClockWidgetProvider::class.java), views)
        
        return update_time
    }
}

override fun doWork () : Result
{
    Log.d("AppWidget", "Inside doWork")

    val context: Context = applicationContext
    getCurrentTime(context)
    
    return Result.success …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-appwidget

7
推荐指数
0
解决办法
72
查看次数