单击 ImageButton 更改 TextView 的文本

Change text of TextView on ImageButton click

我正在尝试更改 TextViewImageButton 单击的文本。但是,当按下按钮时,文本不会改变。

我试过使用TextView tv = (TextView)findViewById(R.id.textView1);。但是,我无法使用 FindViewById 因为我正在使用 RemoteViews.

textView1 的文本设置正确 OnUpdate,但按下按钮时不会改变。当显示 Toast 弹出窗口时,按钮单击已正确注册。

class WidgetClass : AppWidgetProvider
{
      private Book latestBook;
      public static String SaveClick = "Save Book";

      public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
      {
          var me = new ComponentName(context, Java.Lang.Class.FromType(typeof(WidgetClass)).Name);
          appWidgetManager.UpdateAppWidget(me, BuildRemoteViews(context, appWidgetIds));
      }

      private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
      {
          var widgetView = new RemoteViews(context.PackageName, Resource.Layout.widget);
          SetTextViewText(widgetView);
          RegisterClicks(context, appWidgetIds, widgetView);
          return widgetView;
      }

      private void SetTextViewText(RemoteViews widgetView)
      {
          CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
          widgetView.SetTextViewText(Resource.Id.textView1, latestBook.lastSaveTime.ToString("g", currentCulture));
      }

      private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
      {
          var intent = new Intent(context, typeof(WidgetClass));
          intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
          intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);

          widgetView.SetOnClickPendingIntent(Resource.Id.buttonSave, GetPendingSelfIntent(context, SaveClick));
      }

      private PendingIntent GetPendingSelfIntent(Context context, string action)
      {
          var intent = new Intent(context, typeof(WidgetClass));
          intent.SetAction(action);
          return PendingIntent.GetBroadcast(context, 0, intent, 0);
      }

      public override void OnReceive(Context context, Intent intent)
      {
          base.OnReceive(context, intent);

          if (SaveClick.Equals(intent.Action))
          {
              Book book = new Book 
              {
                  lastSaveTime = DateTime.Now
              };
              App.Database.SaveBook(book);

              latestBook = book;

              Toast.MakeText(context, "New BookAdded", ToastLength.Short).Show();

              var widgetView = new RemoteViews(context.PackageName, Resource.Layout.widget);
              SetTextViewText(widgetView);  
          }    
      }
}

widget.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="0.0dp">

        <ImageButton
            android:id="@+id/buttonSave"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_width="65dp"
            android:layout_height="65dp"
            android:scaleType="fitCenter"/>
        <TextView
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_width="135dp"
            android:layout_height="wrap_content"
            android:id="@+id/textView1"/>

    </RelativeLayout>
</LinearLayout>

如何在单击 buttonSave 时更新 textView1 的文本?

您正在 OnReceive 方法中创建新的远程视图。你应该使用现有的。我已经更新了代码。请检查并更新我。

 class WidgetClass : AppWidgetProvider
    {
        private Book latestBook;
        public static String SaveClick = "Save Book";
        RemoteViews remoteView = null;

        public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
        {
            var me = new ComponentName(context, Java.Lang.Class.FromType(typeof(WidgetClass)).Name);
            appWidgetManager.UpdateAppWidget(me, BuildRemoteViews(context, appWidgetIds));
        }

        private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
        {
            var widgetView = new RemoteViews(context.PackageName, Resource.Layout.widget);
            SetTextViewText(widgetView);
            RegisterClicks(context, appWidgetIds, widgetView);
            remoteView = widgetView;
            return widgetView;
        }

        private void SetTextViewText(RemoteViews widgetView)
        {
            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
            widgetView.SetTextViewText(Resource.Id.textView1, latestBook.lastSaveTime.ToString("g", currentCulture));
        }

        private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
        {
            var intent = new Intent(context, typeof(WidgetClass));
            intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
            intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);

            widgetView.SetOnClickPendingIntent(Resource.Id.buttonSave, GetPendingSelfIntent(context, SaveClick));
        }

        private PendingIntent GetPendingSelfIntent(Context context, string action)
        {
            var intent = new Intent(context, typeof(WidgetClass));
            intent.SetAction(action);
            return PendingIntent.GetBroadcast(context, 0, intent, 0);
        }

        public override void OnReceive(Context context, Intent intent)
        {
            base.OnReceive(context, intent);

            if (SaveClick.Equals(intent.Action))
            {
                Book book = new Book
                {
                    lastSaveTime = DateTime.Now
                };
                App.Database.SaveBook(book);

                latestBook = book;

                Toast.MakeText(context, "New BookAdded", ToastLength.Short).Show();

                SetTextViewText(remoteView);
            }
        }
    }