旋转时工具栏图像更新
Toolbar Image update when rotating
我有一个 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
没有源属性,因为图像本身是从服务器接收的 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()
也没有帮助。当我改变方向时仍然没有显示图像。
希望对此有所帮助。
提前致谢
两种解决方案:
1) 从 ConfigurationChanges = ConfigChanges.ScreenSize|ConfigChanges.Orientation
中删除 |ConfigChanges.Orientation
,这意味着您的 activity 将在您的屏幕旋转时重新创建。
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
方法,只需将其删除即可。
我有一个 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
没有源属性,因为图像本身是从服务器接收的 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()
也没有帮助。当我改变方向时仍然没有显示图像。
希望对此有所帮助。 提前致谢
两种解决方案:
1) 从 ConfigurationChanges = ConfigChanges.ScreenSize|ConfigChanges.Orientation
中删除 |ConfigChanges.Orientation
,这意味着您的 activity 将在您的屏幕旋转时重新创建。
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
方法,只需将其删除即可。