私はAndroidアプリウィジェットと少し混乱しています。アクティビティを開始するためのボタンを作成できることは理解していますが、ウィジェット内のTextViewのテキストを編集するためのボタンを作成する方法がわかりません。誰かが私が欠けているものを教えてもらえますか?
よろしくお願いします。
編集:ユーザーが新しいテキストを入力することを意味するのではなく、アプリケーションがUI(つまり、ダイアログボックスやアクティビティ)なしでテキストを自動的に変更することを意味します。
私はAndroidアプリウィジェットと少し混乱しています。アクティビティを開始するためのボタンを作成できることは理解していますが、ウィジェット内のTextViewのテキストを編集するためのボタンを作成する方法がわかりません。誰かが私が欠けているものを教えてもらえますか?
よろしくお願いします。
編集:ユーザーが新しいテキストを入力することを意味するのではなく、アプリケーションがUI(つまり、ダイアログボックスやアクティビティ)なしでテキストを自動的に変更することを意味します。
編集:OK、それであなたはsetOnClickPendingIntentであなたのボタンにgetBroadcastPendingIntentを設定し、レシーバーからの新しいテキストで更新を実行します(またはあなたのupdateメソッドを呼び出します)。AppWidgetProviderクラスをレシーバーにすることができます(onReceiveでインテントをキャッチできます)。それ以外の場合は、BroadcastReceiverを拡張する新しいクラスを作成します。
EDIT2(サンプルコード):
私はこのコードを実行/コンパイルしなかったので、エラーが発生しないことを願っています。これは、カスタムアクションを使用してインテントを保留している基本的な更新を取得するための単純なヘルパーメソッドです。
public PendingIntent getRefreshPendingIntent(Context context, int appWidgetId){
Intent intent = new Intent("my.package.ACTION_UPDATE_WIDGET");
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
オーバーライドされたAppWidgetProviderクラスのonReceiveでカスタムアクションをキャッチします
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
//handle other appwidget actions
if (intent.getAction().equals("my.package.ACTION_UPDATE_WIDGET")) {
//some code here that will update your widget
}
//handle other appwidget actions
}
また、appwidgetレシーバー宣言のマニフェストにカスタムアクションのIntentFilterを追加する必要があります
<receiver
android:name="my.package.MyWidgetProviderClass"
android:label="MyWidget">
<intent-filter>
<action android:name="my.package.ACTION_UPDATE_WIDGET"/>
<!-- other intent filters -->
</intent-filter>
<!-- meta data pointing to widget xml file -->
</receiver>
最後に、保留中のインテントをビルドしている場所でRemoteViewに適用します。これにより、ボタンがクリックされると、my.package.ACTION_UPDATE_WIDGETアクションが送信され、AppWidgetProviderによってキャッチされます。 AppWidgetの更新を実行します
myRemoteViews.setOnClickPendingIntent(R.id.id_of_update_button, getRefreshPendingIntent(context, appWidgetId);
このコードは、ウィジェットをクリックするとウィジェットを更新します。ウィジェットを編集して、リスナーをボタンに変更できます。
public class MyWidgetProvider extends AppWidgetProvider {
private static final String ACTION_CLICK = "ACTION_CLICK";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// Get all ids
ComponentName thisWidget = new ComponentName(context,
MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
// Create some random data
int number = (new Random().nextInt(100));
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
Log.w("WidgetExample", String.valueOf(number));
// Set the text
remoteViews.setTextViewText(R.id.update, String.valueOf(number));
// Register an onClickListener
Intent intent = new Intent(context, MyWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
}
完全なチュートリアルはここにあります。