【发布时间】:2017-06-29 11:12:49
【问题描述】:
我采用了我在这里找到的来源: https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.cs
并在 Xamarin Forms Android 项目中创建了一个自定义渲染器。我得到了要构建的项目和按预期打开/关闭的菜单以及显示起始详细信息页面。
详细信息页面是 Xamarin.Forms 中的“NavigaionPage”,它实际上只是一个 ViewGroup,其中包含一堆代码以使其与 Push/Pop 函数一起使用。
当我推送一个具有自定义渲染器和原生 RelativeLayout 作为子视图的新页面时,页面显示为空白,直到我旋转方向。
在对代码进行一些研究后,我意识到 OnMeasure 和 OnLayout 在被推送到 NavigationPage / 详细信息页面的页面中没有被调用(推送页面的大小停留在 0x0 直到方向改变)。
我创建了另一个自定义渲染器,但这次是为 NavigationPage 创建的,如下所示:
public class MasterDetailContentNavigationPageRenderer : NavigationPageRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
{
base.OnElementChanged(e);
if(e.OldElement != null)
{
e.OldElement.Pushed -= handleOnPushed;
}
if(e.NewElement != null)
{
e.NewElement.Pushed += handleOnPushed;
}
}
private void handleOnPushed(object sender, EventArgs e)
{
var w = MeasureSpec.MakeMeasureSpec(MeasuredWidth, MeasureSpecMode.Exactly);
var h = MeasureSpec.MakeMeasureSpec(MeasuredHeight, MeasureSpecMode.Exactly);
Measure(w, h);
Layout(Left, Top, Right, Bottom);
}
}
详细信息页面/NavigaionPage 的此自定义渲染器适用于我推送的 3 个页面中的 2 个。
主要/最重要的页面没有完全添加所有的 UI 元素。
被推送但缺少 UI 的页面有一些 UI。以下是页面显示方式的列表:
--- SongViewerLayout : 相对布局
----- 相对布局
--------- ViewerTopBar(绘制除一个以外的所有按钮)
--------- DocumentView(顶栏和分页之间的空白点)
--------- ViewerPagination(绘制背景颜色但不绘制页面按钮)
如果我改变方向,缺少的按钮会出现在顶部栏中,页码会显示,文档视图会显示出来,但它会关闭。
如果我重新使用 Xamarin.Forms 提供的 MasterDetailPage,UI 将按预期加载。
我研究了 Xamarin.Forms 存储库中的代码,但没有一个真正适用于所添加元素的内部工作。换句话说,详细页面(在我的例子中是 NavigationPage)被添加到 SetElement(...) 上,并且分配了一些处理程序......但我无法判断它寻找被推送然后响应的页面。我假设/期望 NavigationPage 可以按预期工作,因为它是 MasterDetailPage / DrawerLayout 的子视图。
注意:似乎有最多问题的视图以编程方式添加并给出“LayoutParamaters”。在 AXML 中找到的视图似乎刚刚出现。
在 Android 中“初始化”布局是否缺少什么?我已经在 Android 中制作了原生应用程序,不需要做任何特别的事情。
为什么 NavigationPage 上方的 UI 会导致 NavigationPage 不进行标准初始化?
我错过了什么???
编辑:
我在我的 GitHub 帐户上创建了这个问题的工作示例,您可以在此处克隆: https://github.com/XamarinMonkey/CustomMasterDetail
构建并运行 CustomMasterDetail.Droid(注意 UI 是 MasterDetailPage)
点按任何项目
底部的蓝色条没有页码。
旋转显示页码的方向。
停止构建
注释掉整个类“MainMasterDetailPageRenderer.cs”
重建/运行应用程序
点按任何项目
页码会按预期立即显示,因为它现在使用默认的 MasterDetailPage!
请给点建议!
编辑#2:
感谢一些反馈,这在 6.0 设备中似乎不是问题。我的测试设备是带有 v5.1.1 的“Samsung Galaxy Tab Pro”。不幸的是,我需要这个应用程序回到 4!
编辑#3:
问题必须是在 Android 5.1.1 中以编程方式将视图添加到在 Xamarin.Forms 中膨胀后的本机 RelativeLayout(被推送到 NavigationPage 详细信息页面)。手动调用 Measure / Layout 似乎可以解决问题。但我需要一个更自动化的解决方案。
【问题讨论】:
-
链接是xamarin表单的源代码。你能在你的代码中显示 MasterDetialPage 渲染吗?
-
查看我的编辑,我在 GitHub 上有一个工作示例
-
我已经在我的 android 6.0 设备上测试了你的代码。它可以工作并且可以在不注释掉
MainMasterDetailPageRenderer的情况下显示页码。 -
我正在使用带有 v5.1.1 的“Samsung Galaxy Tab Pro”
-
你在其他设备上测试过吗?
标签: android xamarin.android xamarin.forms master-detail custom-renderer