나는 안드로이드 위젯을 사용하기 위해 아주 간단한 코드 만 사용하려고합니다. 나는 도처에서 둘러 보았고 좋은 대답을 찾지 못했습니다.Android Widget이 터치에 응답하지 않습니다.
내가 원했던 (지금은) 위젯을 터치하고 현재 값을 표시 할 때 카운터를 증가시키고 싶습니다. 후
<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을 (표시) 홈 화면에 배치 된 후 즉시 호출되고 :
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);
}
}
}
이 내 매니페스트의 일부는 다음과 같습니다
이
내의 AppWidgetProvider입니다 만져지고 있지만 숫자는 결코 증가하지 않습니다. 위젯이 어떻게 작동하는지 완전히 이해하지는 않지만 onUpdate() 이후에 살해되고 있습니까? 그래서 이렇게하려면 지속적인 저장 장치를 사용해야할까요?또한 현재 다른 위젯을 추가하면 둘 다 동일한 값을 표시하고 하나만 터치해도 증가합니다. 각 위젯이 자신의 카운터를 가질 수있는 방법이 있습니까?
감사합니다.
굉장히 고마워요!나는 블로그 게시물을 읽는 것보다 더 많은 것을 배웠다. onReceive() 메서드의 첫 번째 또는 마지막 명령으로 super.onReceive()를 호출하는 것의 차이점은 무엇입니까? 저는 항상 슈퍼에 관한 질문을했습니다. – Sandy
사실 그것은 당신이하는 일에 달려 있습니다. 예를 들어 return (; return을 호출하여)을 끝내고 싶다면 중간에 어딘가에 메소드를 넣고 싶으면 super (먼저 return 호출 전에)를 호출해야합니다. 그렇지 않으면 last를 호출해야합니다. 그러나 안드로이드에는 super.onDestroy를 먼저 호출해야하는 다른 메소드가 있습니다 (잘 기억한다면 Activity의 onDestroy). 내 응용 프로그램 위젯에서 마지막 명령으로 super.onReceive를 호출하고 있습니다 ... – Christos
onReceive()에서 임의의 값과 같도록 touchCounter를 수정했습니다 (touchCounter = new Random(). nextInt (100);) onUpdate()에서 TextView가 수정되었지만 여전히 값을 변경하지 않은 경우 주석 처리했습니다. 나는 다른 것을 놓치고 있습니까? – Sandy