【问题标题】:Android AppWidget Not Displaying On Certain PhonesAndroid AppWidget 未在某些手机上显示
【发布时间】:2012-03-30 22:32:40
【问题描述】:

我有一个非常简单的 appwidget(两个文本视图和一个按钮)。我已经在触摸板、Droid 1 和 Droid Razr 上对其进行了测试。它适用于除 Razr 之外的所有设备。当我将小部件添加到主屏幕时,它不会显示;它只是看不见的。如果我在它所在的位置按住它会选择一个小部件,如果我四处移动它,我会看到其他小部件移开,但它完全不可见。

我在onReceiveonEnabled 方法中放了一些Toast,Toast 显示所有正确信息(即意图操作和附加信息)。

有人有这方面的经验吗?

编辑:请记住,这只是为了调试,不遵循最佳实践

public class GoogleTalkWidget extends AppWidgetProvider {

    Button sendMessage;

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Received Intent Action = " +
                intent.getAction(), Toast.LENGTH_SHORT).show();

        if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){
            RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.main_widget);

            views.setTextViewText(R.id.widget_message, 
                (CharSequence)intent.getStringExtra("MESSAGE"));

            views.setTextViewText(R.id.widget_sender, 
                (CharSequence)intent.getStringExtra("SENDER"));

            Toast.makeText(context, "Received " + 
                intent.getStringExtra("MESSAGE") + " FROM " + 
                intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show();

            ComponentName cn = new ComponentName(context, 
                GoogleTalkWidget.class);  

            AppWidgetManager.getInstance(context).updateAppWidget(cn, views);

        }
        super.onReceive(context, intent);
    }

    @Override 
    public void onEnabled(final Context context){
        super.onEnabled(context);

        Toast.makeText(context, "Enabled", Toast.LENGTH_SHORT).show();
    }

}

【问题讨论】:

  • onReceive()?你的意思是onUpdate() 还是你的AppWidgetProvider
  • 您还可以在 appwidget 中覆盖 onReceive() 方法...我认为他们将其保留是因为早期版本的 Android 与 onDelete 存在一些问题
  • 我明白这一点。但是,onUpdate() 通常是您提供RemoteViews 以声明应用小部件中应该包含的内容的位置。是否正在调用 onUpdate() 并且您是否成功提供了 RemoteViews? LogCat 中是否有任何可能相关的内容(例如堆栈跟踪)?
  • 检查上面添加的代码......我不想使用更新......我将它用作广播接收器,并让我的服务在我需要更新时发送广播。 ...更多的是推送通知而不是投票:-)。在任何情况下,我都看不到堆栈跟踪或错误......事实上,除了在 Razr 上不显示小部件这一事实之外,代码运行得很好
  • “我不想使用更新”——您别无选择,至少对于您的初始更新而言。

标签: android android-widget android-appwidget


【解决方案1】:

我能想到的最好的事情(假设 Razr 的启动器没有错误或其他问题)是您的资源配置不正确。也许 Razr 具有不同的 dpi 密度,而您的项目中没有该密度的资源。

例如,尝试将构成您的小部件的所有可绘制对象移动到文件夹 res\drawable-nodpi 并查看它的运行情况。

编辑:我在你的代码中看到了一些奇怪的东西

在您的 GoogleTalkWidget 类的 onReceive 方法中,您的小部件仅在收到消息 Utils.RECEIVED_MESSAGE_WIDGET 时更新。我不知道这条消息是什么,但一个应用小部件,第一次添加到主屏幕上,它接收 android.appwidget.action.APPWIDGET_UPDATE 并且任何其他意图过滤器都在清单文件中注册,它们是当时由系统广播(当然还有粘性广播意图)。

如果我处于你的位置,我会按如下方式更改 onReceive 方法:

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Received Intent Action = " +
            intent.getAction(), Toast.LENGTH_SHORT).show();
    super.onReceive(context, intent);

    String msg = "No messages yet";

    RemoteViews views = new RemoteViews(context.getPackageName(),
            R.layout.main_widget);

    if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){
        msg = intent.getStringExtra("MESSAGE");

        views.setTextViewText(R.id.widget_sender, 
            (CharSequence)intent.getStringExtra("SENDER"));

        Toast.makeText(context, "Received " + 
            intent.getStringExtra("MESSAGE") + " FROM " + 
            intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show();

        ComponentName cn = new ComponentName(context, 
            GoogleTalkWidget.class);  
    }

    views.setTextViewText(R.id.widget_message, msg);

    AppWidgetManager.getInstance(context).updateAppWidget(cn, views);
}

看看会发生什么。

如果您的小部件无法显示,那么它可能是 Razr 的问题,但这是不同的,因为我认为一大堆其他小部件都可以正常工作。

此外,虽然您的代码仅用于调试,但您的方法有点问题。更新小部件视图的最佳位置是在 AppWidgetProvider 的 onUpdate 方法中,而不是在 onReceive 中。为此,Android 提供了 onUpdate 方法和 onReceive 来通知您已注册的广播已到达。基本区别在于,在 onUpdate 方法中,Android 已经从收到的 Intent extras 中为您提取了所有需要的参数。关于小部件更新的另一件事是,即使您不希望小部件定期更新,您也应该在小部件 xml 文件中提供 android:updatePeriodMillis 值而不是 0(2100000 是一个很好的值)。我在某处看到,如果这个值为 0,onReceive 方法可能不会被调用。

还请记住,AppWidgetProvider 作为广播接收器仅在 onReceive 方法完成其工作时才存在,之后被销毁,因此它不是 UI 侦听器等“交互式”代码的好地方。我告诉您之所以这样做,是因为您在 GoogleTalkWidget 类的顶部有一个 Button 声明 (Button sendMessage;)。

希望这会有所帮助...

【讨论】:

  • 现在我只是想让它工作,所以它的骨架非常简单......没有可绘制对象或类似的东西......只是一个文本视图和按钮
  • 至于onReceive的内容,我已经忘记了,一直没更新,还是没解决问题就继续。自从我发布了这个问题以来,我尝试删除部分代码,直到我只有一个名为 superonUpdate ,仅此而已;仍然没有工作。至于 onUpdateonReceive 我并没有真正考虑过,因为这个项目由于 Razr 的这个问题而被搁置了,但是感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多