Android小工具不响应触摸(Android widget not responding to t

2019-09-17 04:36发布

我想只是一些非常简单的代码来获得一个Android小工具去,但没有运气。 我看着到处并没有找到一个很好的答案。

所有我想要的(现在)是递增计数器,当小部件被触摸和显示当前值。

这是我的AppWidgetProvider:

public class WordWidget extends AppWidgetProvider
{
    Integer touchCounter = 0;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
        //This is run when a new widget is added or when the update period expires.
        Log.v("wotd",  "Updating " + appWidgetIds.length + " widgets");

        for(int x = 0; x < appWidgetIds.length; x++)
        {
            Integer thisWidgetId = appWidgetIds[x];

            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
            remoteViews.setTextViewText(R.id.mainText, touchCounter.toString());

            Intent widgetIntent = new Intent(context, WordWidget.class);
            widgetIntent.setAction("UPDATE_NUMBER");

            PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0);

            remoteViews.setOnClickPendingIntent(R.id.widgetLinearLayout, widgetPendingIntent);
            appWidgetManager.updateAppWidget(thisWidgetId, remoteViews);
        }
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.v("wotd", "In onReceive with intent=" + intent.toString());
        if (intent.getAction().equals("UPDATE_NUMBER"))
        {
            Log.v("wotd", "In UPDATE_NUMBER");
            touchCounter++;
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
            remoteViews.setTextViewText(R.id.mainText, touchCounter.toString());
        } else
        {
            Log.v("wotd", "In ELSE... going on to super.onReceive()");
            super.onReceive(context, intent);
        }
    }
}

这是我的清单的一部分:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <receiver
        android:icon="@drawable/ic_launcher"
        android:name="com.example.mywidget.WordWidget"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="UPDATE_NUMBER" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widgetinfo" />
    </receiver>

</application>

该日志显示的onReceive()被放置在主屏幕上后立即调用,并且被感动后,但是数量永远不会增加。 我不完全理解小部件是如何工作的,但他们的onUpdate杀害后()? 因此,要做到这一点,我将不得不使用某种类型的持续性存储的?

另外,如果我现在添加其他部件都将显示相同的值,并增加哪怕我只摸一个。 是否有每个方式和任何部件上有它自己的柜台?

谢谢!

Answer 1:

其实你已经回答了你的问题。 但是,让我们澄清一些事情:

A. AppWidgets都没有,只要是在主屏幕上丧生。 但他们不属于你。 它们在家庭应用的进程中运行。 更具体地讲他们的意见在家庭应用的过程中运行,这就是为什么你看到你的小部件,但它不会做你期望什么,这就是为什么我们为了更新他们正在使用RemoteViews代替意见。

B. AppWidgetProviders(你的情况WordWidget类),在另一方面,尽快的onReceive方法完成销毁。 在他们所有的变量重新初始化,每次的onReceive方法被调用的时间。 这就是为什么你的号码永远不会增加。 一个的AppWidgetProvider的目的是更新widget的RemoteViews并告知您的应用程序注册的广播已经到来。

C.的AppWidgetProvider的方法的onUpdate为您提供的部件标识必须更新的数组。 这是唯一的代码点,你可以用它来得到你的控件实例和其ID的数量。 因为RemoteViews的有没有办法从你的widget的浏览一些有用的值(例如您无法读取TextView的计数器值),所以你必须使用所提供的信息和DO每件ID 坚持你的计数器值。 当下的onUpdate被调用你读从存储的价值,增加它,用新的值更新部件,然后存储新的值返回。

D.如果你的部件必须做很多事情还是慢的东西(如联网)时,它的时间进行自我更新,你应该考虑使用服务这一点。 但是,在你的情况(增加数字)你的做法是蛮好的,只要你坚持永久存储或其他地方的计数器。

最后,我已经注意到,在您的onReceive覆盖您呼叫的‘super.onReceive’只有当你没有收到‘UPDATE_NUMBER’行动。 这是不是一个好的做法,除非有很好的理由(这是另一个故事)随时拨打super.onReceive作为第一或覆盖中的最后一个命令。

希望这可以帮助...



文章来源: Android widget not responding to touches