Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android小部件无响应_Android_Widget - Fatal编程技术网

android小部件无响应

android小部件无响应,android,widget,Android,Widget,我有一个小部件,你按下它,然后它会更新小部件上的文本。我已经设置了一个点击监听器来启动另一个活动来执行文本更新,但由于某些原因,它只会暂时工作,然后它会变得无响应,按下时不会执行任何操作。有人知道为什么会这样吗?我已经在下面发布了我的小部件代码,以防有用 @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { thisWidget = n

我有一个小部件,你按下它,然后它会更新小部件上的文本。我已经设置了一个点击监听器来启动另一个活动来执行文本更新,但由于某些原因,它只会暂时工作,然后它会变得无响应,按下时不会执行任何操作。有人知道为什么会这样吗?我已经在下面发布了我的小部件代码,以防有用

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
    thisWidget = new ComponentName(context, MemWidget.class);
    Intent intent = new Intent(context, updatewidget.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

    // Get the layout for the App Widget and attach an on-click listener to the button
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
    views.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent);

    // Tell the AppWidgetManager to perform an update on the current App Widget
    appWidgetManager.updateAppWidget(thisWidget, views);

}

@Override
public void onReceive(Context context, Intent intent) 
{
    appWidgetManager = AppWidgetManager.getInstance(context);
    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
    thisWidget = new ComponentName(context, MemWidget.class);

    // v1.5 fix that doesn't call onDelete Action
    final String action = intent.getAction();
    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 
    {   
        super.onReceive(context, intent);
    }
}
下面是从我的活动中调用的代码

thisWidget = new ComponentName(this, MemWidget.class);
appWidgetManager = AppWidgetManager.getInstance(this);
remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget);

//do work

remoteViews.setTextViewText(R.id.ImageButton01,"setting text here");
appWidgetManager.updateAppWidget(thisWidget, remoteViews);

那里的onUpdate方法不会更新RemoteView中除PendingEvent之外的任何数据,因此如果调用了该方法,小部件将恢复到R.layout.widget中定义的状态

您有在用户交互后调用updateAppWidget的代码吗?这可能也有帮助

此外,如果更新是内联的并且不需要任何UI,则不需要启动活动来进行更新。如果您的PendingEvent用于广播接收器,则使用PendingEvent.getBroadcast会更高效,并且不会中断后堆栈。您可以使用与应用程序小部件提供商相同的BroadcastReceiver。你不需要另一个


更新:(我无法回复以下内容,因为文本太长)

我将创建一个这样的函数,并从onUpdate()的活动中调用它。您需要将文本保存在某个位置,以便也可以从onUpdate()传入。否则,它会将文本还原为R.layout.widget中的默认文本

void updateWidget(Context context, CharSequence text) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    remoteViews.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent);

    remoteViews.setTextViewText(R.id.ImageButton01, text);

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    ComponentName thisWidget = new ComponentName(context, MemWidget.class);
    appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}

谢谢你的回复。我添加了在启动活动的用户交互之后调用updateappwidget的代码。我会将小部件更改为使用broadcastreceiver,而不是启动活动,这是不必要的。在寻找解决方案时,我发现了这样一个答案:“确保我在每次RemoteView更新时发送所有PendingEvents,即使它们已经设置好。当方向改变时,布局会膨胀,并且只有最近缓存的RemoteView才会应用到它上面。”但我该怎么做呢?