0

我把我发现这里的源详细信息页面: https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.csXamarin的Android定制MasterDetailPage不是要求OnLayout当页面推到这是NavigaionPage

开创了一个Xamarin自定义窗体渲染的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工作了2挡我推页的3。

主要/最重要的页面没有完全添加所有UI元素。

推送并丢失UI的页面有一些UI。以下是如何在页面显示的列表:

--- SongViewerLayout:RelativeLayout的

------ RelativeLayout的

--------- 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

  1. 生成并运行CustomMasterDetail.Droid(请注意UI是一个MasterDetailPage)

  2. 点击任意项目

  3. 底部的蓝色条没有页码。

  4. 旋转方向页码显示。

  5. 停止构建

  6. 注释出整个类 “MainMasterDetailPageRenderer.cs”

  7. 重构/运行应用程序

  8. 轻按

  9. 页号码的显示的任何项目因为它现在正在使用默认的MasterDetailPage!

  10. 请给出建议!

编辑#2:

感谢一些反馈,它似乎并不成为一个问题6.0设备。我的测试设备是v5.1.1的“三星Galaxy Tab Pro”。不幸的是,我需要这个应用程序回到4!

编辑#3:

问题必须被Android中5.1.1编程添加视图于天然的RelativeLayout(其推送到NavigationPage细节页)它是在Xamarin.Forms充气之后。手动调用度量/布局似乎可以解决问题。但我需要一个更自动化的解决方案。

+0

该链接是xamarin表单的源代码。你能在你的代码中显示MasterDetialPage渲染吗? –

+0

查看我的编辑,我在GitHub上有一个工作示例 –

+0

我已经在我的android 6.0设备中测试了您的代码。它可以工作,并且可以显示页面编号,而不需要注释'MainMasterDetailPageRenderer'。 –

回答

0

我想出了一个可行的解决方案。它可能很昂贵,但它似乎在我测试过的设备上快速布局。

基本上,我在Android上进行了阅读,并找到了一种方法来使用ViewTreeObserver.GlobalLayout事件并结合调用详细和主ViewGroups上的Measure/Layout来侦听布局更改。

public void MeasureAndLayoutNative() 
{ 
    if(_childView != null) 
    { 
     IVisualElementRenderer renderer = Platform.GetRenderer(_childView); 
     if(renderer.ViewGroup != null) 
     { 
      var nativeView = renderer.ViewGroup; 

      var w = MeasureSpec.MakeMeasureSpec(nativeView.MeasuredWidth, MeasureSpecMode.Exactly); 
      var h = MeasureSpec.MakeMeasureSpec(nativeView.MeasuredHeight, MeasureSpecMode.Exactly); 
      nativeView.Measure(w, h); 
      nativeView.Layout(nativeView.Left, nativeView.Top, nativeView.Right, nativeView.Bottom); 
     } 
    } 
} 

我更新了上面的代码示例,其中包含工作更改!

相关问题