单击 ImageButton 更改 TextView 的文本
Change text of TextView on ImageButton click
我正在尝试更改 TextView
和 ImageButton
单击的文本。但是,当按下按钮时,文本不会改变。
我试过使用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);
}
}
}
我正在尝试更改 TextView
和 ImageButton
单击的文本。但是,当按下按钮时,文本不会改变。
我试过使用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);
}
}
}