私はAndroidウィジェットを手に入れるために非常に簡単なコードを試していますが、運はありません。私は周りを見回し、良い答えを見つけていない。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()の後に殺されていますか?だからこれを行うには、何らかの永続的なストレージを使用する必要がありますか?
また、私が現在別のウィジェットを追加している場合、両方に同じ値が表示され、1つだけタッチしても増分します。どのウィジェットにも自分のカウンターを持たせる方法はありますか?
ありがとうございます!
大変ありがとうございます!私はブログ記事を読んでから何時間もあなたに答えました。 onReceive()メソッドの最初または最後のコマンドとしてsuper.onReceive()を呼び出すことの違いは何ですか?私はいつもスーパーに関してこの質問をしてきました。 – Sandy
実際それはあなたが何をしているかによって異なります。たとえば、return(; returnを呼び出して)を途中で終了させたい場合は、最初に(戻り呼び出しの前に)superを呼び出す必要があります。しかし、Androidには、super.onDestroyを最初に呼び出さなければならない他のメソッドがあります(よく覚えていれば、ActivityのonDestroy)。私のアプリウィジェットでは、最後のコマンドとしてsuper.onReceiveを呼び出しています... – Christos
onReceive()では、touchCounterをランダムな値に等しくなるように変更しました。(touchCounter = new Random()。nextInt(100);) onUpdate()でTextViewが変更されたときにコメントアウトしても値は変更されません。他に何かが足りないのですか? – Sandy