【问题标题】:How to change the ImageView source dynamically in Xamarin Android(Widget)如何在 Xamarin Android(Widget) 中动态更改 ImageView 源
【发布时间】:2020-04-10 11:02:32
【问题描述】:

我创建了 Android Widget,所以我想动态更改图像源。 我尝试过的小部件代码无法加载,但是当我删除更改 ImageView 源的代码时,它可以正常加载。

这是我的代码。

   int test = (int)typeof(Resource.Drawable).GetField("Cloud").GetValue(null);



    public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {

        var x = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);

        appWidgetManager.UpdateAppWidget(x, BuildRemoteViews(context, appWidgetIds));


    }

    private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
    {

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


        LoadData(widgetView);


        return widgetView;
    }

    private void LoadData(RemoteViews widgetView)
    {

        widgetView.SetTextViewText(Resource.Id.widgetCity,city);
        widgetView.SetTextViewText(Resource.Id.widgetWeatherDescription, description);
         widgetView.SetImageViewResource(Resource.Id.widgetIcon, test); //This line fails the widget from loading          

    }

我可能做错了什么或者我可以做些什么来解决这个问题。 我正在使用 Xamarin Android

【问题讨论】:

    标签: android xamarin.android


    【解决方案1】:

    由于您的代码不完整,我编写了一个简单的示例供您检查。

    我给ImageView添加了一个点击事件,当你点击imageview时,它会改变图片资源。

    [BroadcastReceiver(Label = "HellApp Widget")]
    [IntentFilter(new string[] { "android.appwidget.action.APPWIDGET_UPDATE" })]
    // The "Resource" file has to be all in lower caps
    [MetaData("android.appwidget.provider", Resource = "@xml/appwidgetprovider")]
    public class AppWidget : AppWidgetProvider
    {
        private static string AnnouncementClick = "AnnouncementClickTag";
        private int test = (int)typeof(Resource.Drawable).GetField("fivePlus").GetValue(null);
        /// <summary>
        /// This method is called when the 'updatePeriodMillis' from the AppwidgetProvider passes,
        /// or the user manually refreshes/resizes.
        /// </summary>
        public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
        {
            var me = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);
            appWidgetManager.UpdateAppWidget(me, BuildRemoteViews(context, appWidgetIds));
        }
    
        private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
        {
            // Retrieve the widget layout. This is a RemoteViews, so we can't use 'FindViewById'
            var widgetView = new RemoteViews(context.PackageName, Resource.Layout.Widget);
    
            LoadData(widgetView);
            RegisterClicks(context, appWidgetIds, widgetView);
            return widgetView;
        }
    
    
        private void LoadData(RemoteViews widgetView)
        {
    
            widgetView.SetTextViewText(Resource.Id.widgetMedium, "HelloAppWidget");
            widgetView.SetTextViewText(Resource.Id.widgetSmall, string.Format("Last update: {0:H:mm:ss}", DateTime.Now));
    
        }
    
        private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
        {
            var intent = new Intent(context, typeof(AppWidget));
            intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
            intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);
    
            // Register click event for the Background
            var piBackground = PendingIntent.GetBroadcast(context, 0, intent, PendingIntentFlags.UpdateCurrent);
            widgetView.SetOnClickPendingIntent(Resource.Id.widgetBackground, piBackground);
    
            // Register click event for the Announcement-icon
            widgetView.SetOnClickPendingIntent(Resource.Id.widgetAnnouncementIcon, GetPendingSelfIntent(context, AnnouncementClick));
        }
    
        private PendingIntent GetPendingSelfIntent(Context context, string action)
        {
            var intent = new Intent(context, typeof(AppWidget));
            intent.SetAction(action);
            return PendingIntent.GetBroadcast(context, 0, intent, 0);
        }
    
        /// <summary>
        /// This method is called when clicks are registered.
        /// </summary>
        public override void OnReceive(Context context, Intent intent)
        {
            base.OnReceive(context, intent);
    
            // Check if the click is from the "Announcement" button
            if (AnnouncementClick.Equals(intent.Action))
            {
                try
                {
                    RemoteViews remoteViews = new RemoteViews(context.PackageName, Resource.Layout.Widget);
                    remoteViews.SetImageViewResource(Resource.Id.widgetAnnouncementIcon, Resource.Drawable.fivePlus);
                    AppWidgetManager appWidgetManager = AppWidgetManager.GetInstance(context);
                    ComponentName componentName = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);
                    appWidgetManager.UpdateAppWidget(componentName, remoteViews);
            }
                catch
                {
                    // Something went wrong :)
                }
            }
        }
    }
    

    【讨论】:

    • 仍然无法加载。
    • 我好像误会了。稍后我会测试并给你答复
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2017-02-17
    • 2013-11-01
    • 2013-04-12
    • 2017-08-18
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多