工具栏旋转时图像更新

问题描述 投票:0回答:1

我有一个Xamarin表单应用程序,我通过xml文件设置Toolbar

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/customToolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minHeight="?android:attr/actionBarSize"
android:background="?android:attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

<ImageView
android:id="@+id/toolbarImage" 
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="right"
android:layout_weight="1"
android:paddingRight="5dp"/>
</android.support.v7.widget.Toolbar>

并在MainActivity的OnCreate方法中设置它

ToolbarResource = Resource.Layout.CustomToolbar;

ImageView没有source属性,因为图像本身是从服务器接收为base64字符串。要将图片添加到Toolbar,我使用了OnStart方法

ImageView toolbarImg = this.FindViewById<ImageView>(Resource.Id.toolbarImage);
            if(!String.IsNullOrEmpty(imgAsBase64))
            {
                    byte[] imageBytes = Convert.FromBase64String(imgAsBase64);
                    Android.Graphics.Bitmap decodedByte = Android.Graphics.BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
                    toolbarImg.SetImageBitmap(decodedByte);

            }

到目前为止,这是有效的,但是当我改变方向时,图像消失了。

我试过的是再次在OnConfigurationChanged中添加图像,但这并没有改变任何东西。

在分配新图片之前,还将ImageView的图像设置为null,Invalidate()PostInvalidate()RequestLayout()也没有帮助。当我改变方向时,仍然没有显示图像。

希望得到一些帮助。提前致谢

android xamarin xamarin.android android-toolbar
1个回答
1
投票

两种解决方案

1)从|ConfigChanges.Orientation中删除ConfigurationChanges = ConfigChanges.ScreenSize|ConfigChanges.Orientation,这意味着当您的屏幕旋转时,您的活动将重新创建。

2)在你的OnConfigurationChanged方法中添加以下代码,在SetImageToToolbar();方法之上,如下所示:

    public override void OnConfigurationChanged(Configuration newConfig)
    {
        base.OnConfigurationChanged(newConfig);
        ToolbarResource = Resource.Layout.CustomToolbar;
        global::Xamarin.Forms.Forms.Init(this, null);
        LoadApplication(new App());
        SetImageToToolbar();
    }

为什么要添加这些代码?

我认为在屏幕旋转时代码中的imgView有问题,所以我认为OnCreate()方法中的代码会有所帮助。

更新:

第二个解决方案有问题,如果你有很多页面,它会出错,所以我提供另一个解决方案,使用自定义NavigationPageRenderer

1)在你的pcl中添加MyNavigationPage

namespace ToolbarTestApp
{
    class MyNavigationPage:NavigationPage
    {
        public MyNavigationPage(Page root) : base(root) {
        }
    }
}

2)用MainPage = new MyNavigationPage(new TestPage());替换MainPage = new NavigationPage(new TestPage());

3)在你的android项目中添加MyNavigationPageRender

[assembly: ExportRenderer(typeof(MyNavigationPage), typeof(MyNavigationPageRender))]
namespace ToolbarTestApp.Droid
{
    class MyNavigationPageRender : NavigationPageRenderer
    {
        public MyNavigationPageRender(Context context) : base(context)
        {
        }

        protected override void OnLayout(bool changed, int l, int t, int r, int b)
        {
            base.OnLayout(changed, l, t, r, b);
            (Xamarin.Forms.Forms.Context as MainActivity).SetImageToToolbar();
        }
    }
}

将您的SetImageToToolbar方法更改为public,您无需覆盖OnConfigurationChanged方法,只需将其删除即可。

© www.soinside.com 2019 - 2024. All rights reserved.