joa*_*car 6 xamarin.android xamarin xamarin.forms
目前正在开发一个我想使用AppCompat的项目,并且在大多数页面上都要求设置标题和副标题.
它根本不能使用AppCompat - 既不设置属性也不使用自定义视图.
不使用AppCompat时,两者都按预期工作.这里有完整的源代码,所以如果你好奇的话就运行应用程序:)
using System.ComponentModel;
using Android.App;
using Android.Widget;
using App1.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
#if __APPCOMPAT__
using NavigationRenderer = Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer;
#else
using NavigationRenderer = Xamarin.Forms.Platform.Android.NavigationRenderer;
#endif
[assembly: ExportRenderer(typeof(NavigationPage), typeof(NavigationPageRenderer))]
namespace App1.Droid.Renderers
{
public class NavigationPageRenderer : NavigationRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
{
base.OnElementChanged(e);
SetCustomView(e.NewElement.CurrentPage.GetType().Name);
}
private void SetCustomView(string view)
{
var activity = (Activity)Context;
#if __APPCOMPAT__
var actionBar = ((FormsAppCompatActivity)Context).SupportActionBar;
#else
var actionBar = activity.ActionBar;
#endif
actionBar.Title = view;
actionBar.Subtitle = " -> " + view;
var abv = new LinearLayout(activity)
{
Orientation = Orientation.Vertical
};
var main = new TextView(activity)
{
Text = view,
};
main.SetTextColor(Color.Aqua.ToAndroid());
main.SetPadding(4, 4, 2, 6);
abv.AddView(main);
abv.AddView(new TextView(activity)
{
Text = " -> " + view
});
actionBar.SetDisplayShowCustomEnabled(true);
actionBar.CustomView = abv;
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName.Equals("CurrentPage"))
{
SetCustomView(((NavigationPage)sender).CurrentPage.GetType().Name);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢@jimmgarr.稍微改变代码以保持AppCompbat和"正常模式"之间的交替.代码可在此处获得
小智 7
所以看起来NavigationPage 使用自己的工具栏实例.这就是为什么在SupportActionBar上设置属性没有做任何事情.
我能够通过覆盖来获得它的工作,OnViewAdded()以便在添加时获得对新工具栏的引用:
public override void OnViewAdded(Android.Views.View child)
{
base.OnViewAdded(child);
if (child.GetType() == typeof(Support.Toolbar))
toolbar = (Support.Toolbar)child;
}
Run Code Online (Sandbox Code Playgroud)
然后使用内部引用SetCustomView()仅设置字幕,因为标题已经自动设置.
这是完整的渲染器类 :)
| 归档时间: |
|
| 查看次数: |
5051 次 |
| 最近记录: |