1

我对 Android 应用小部件有点困惑。我知道我可以创建一个按钮来启动一个活动,但我看不到如何创建一个按钮来编辑小部件内的 TextView 的文本。有人可以告诉我我错过了什么吗?

提前非常感谢。

编辑:我的意思不是让用户输入新文本,我的意思是让应用程序自动更改文本,无需任何 UI(即对话框或活动)。

4

2 回答 2

3

编辑:好的,所以您使用 setOnClickPendingIntent 在您的按钮上设置了一个getBroadcast PendingIntent 并使用来自接收器的新文本执行您的更新(或调用您的更新方法)。您的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>

最后,您将挂起的意图应用于您正在构建它的 RemoteViews,因此当单击按钮时,它将发送 my.package.ACTION_UPDATE_WIDGET 操作,该操作将被您的 AppWidgetProvider 捕获,您可以在其中(或调用方法)执行您的 AppWidget 更新

myRemoteViews.setOnClickPendingIntent(R.id.id_of_update_button, getRefreshPendingIntent(context, appWidgetId);
于 2012-08-11T01:04:48.213 回答
2

当您单击它时,此代码会更新小部件,您可以对其进行编辑并将侦听器更改为您的按钮:

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);
}
}
} 

完整的教程在这里

于 2012-08-12T03:56:41.957 回答