0

Я взял источник я нашел здесь: https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Platform.Android/Renderers/MasterDetailRenderer.csXamarin Android Пользовательские MasterDetailPage не вызывая OnLayout когда страница толкнул подробно страницу, с которой NavigaionPage

И создал пользовательский визуализатор в Xamarin Forms Android проекта. Я получил проект для сборки и меню, чтобы открыть/закрыть, как ожидалось, а также отобразить начальную страницу подробностей.

Эта страница представляет собой «NavigaionPage» в Xamarin.Forms, который на самом деле представляет собой просто ViewGroup с кучей кода, чтобы заставить его работать с функциями Push/Pop.

Когда я нажимаю новую страницу, которая имеет собственный рендерер и родной RelativeLayout в качестве подзаголовка, страница становится пустой до тех пор, пока я не поверну

После некоторых исследований в коде я понял, что OnMeasure и OnLayout не вызывались на странице, которая была нажата на страницу NavigationPage/detail (размер задвинутой страницы застрял в 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-х моих подтолкнули Страницы.

Основная/самая важная страница не полностью добавила все элементы пользовательского интерфейса.

Страница, которая была нажата и отсутствует, имеет пользовательский интерфейс. Ниже приведен список того, как отображается страница:

--- SongViewerLayout: RelativeLayout

------ RelativeLayout

--------- ViewerTopBar (рисует все кнопки, за исключением одного)

--------- DocumentView (пустое белое пятно между верхней панелью и пагинацией)

--------- ViewerPagination (рисует цвет фона, но не кнопки страницы)

Если я изменяю ориентацию, в верхней панели отображается отсутствующая кнопка, отображаются номера страниц, а вид документа выглядит как ничья, но он выключен.

Если я вернусь к использованию Xamarin.Forms, предоставленный MasterDetailPage, пользовательский интерфейс загружается, как и ожидалось.

Я изучил код в репозитории Xamarin.Forms, но ничто из этого не применимо к внутренней работе добавленных элементов. Другими словами, страница с деталями (которая в моем случае является NavigationPage) добавляется в SetElement (...), и некоторые обработчики назначаются ... но я ничего не могу сказать, что ищет страницы, которые нажимаются, а затем реагируют. Я бы предположил/ожидал, что NavigationPage будет работать так, как ожидалось, теперь, когда он будет рассмотрен в MasterDetailPage/DrawerLayout.

Примечание: взгляды, которые, как представляется, имеют наибольшее количество проблем, программно добавляются и даются «LayoutParamaters». Представления, найденные в AXML, похоже, просто появляются.

  • Есть ли что-то, что мне не хватает, чтобы «инициализировать» макет в Android?Я сделал собственные приложения на Android и не должен был делать ничего особенного.

  • Почему пользовательский интерфейс над навигационной страницей заставляет NavigationPage не выполнять стандартную инициализацию?

  • Что мне не хватает ???

Edit:

Я создал рабочий пример этого вопроса на моем GitHub счет, который вы можете клонировать здесь: https://github.com/XamarinMonkey/CustomMasterDetail

  1. Построить и запустить CustomMasterDetail.Droid (Обратите внимание на интерфейс является MasterDetailPage)

  2. Кресло любого предмета

  3. Нижняя синяя полоса не имеет номеров страниц.

  4. Повернуть ориентацию отображения номеров страниц.

  5. Остановить Билд

  6. закомментировать весь класс "MainMasterDetailPageRenderer.cs"

  7. Rebuild/запустить приложение

  8. Нажмите любой элемент

  9. номера страниц приведены сразу же, как и ожидалось, только потому, что теперь использует стандартный файл MasterDetailPage!

  10. Дайте предложения, пожалуйста!

Edit # 2:

Благодаря некоторой обратной связи, это, кажется, не является проблемой в 6.0 устройств. Мое тестовое устройство - «Samsung Galaxy Tab Pro» с v5.1.1. И, к сожалению, мне нужно это приложение, чтобы вернуться к 4!

Edit # 3:

вопрос должен быть добавив вид программно в Android 5.1.1 нативного RelativeLayout (который проталкивается к странице детали NavigationPage) после того, как он раздувается в Xamarin.Forms. Кажется, что вызов метода/макета вручную решает проблему. Но мне нужно более автоматическое решение.

+0

Ссылка является исходным кодом форм xamarin. Можете ли вы показать рендеринг MasterDetialPage в своем коде? –

+0

Смотрите мои правки, у меня есть рабочий пример на GitHub –

+0

У меня есть тестовый код на моем устройстве Android. Он работает и может показывать номер страницы без комментариев из 'MainMasterDetailPageRenderer'. –

ответ

0

Я придумал решение, которое работает. Это может быть дорого, но, по-видимому, он быстро адаптируется к устройствам, которые я тестировал.

В основном, я прочитал на Android и нашел способ прослушать изменения макета с помощью события ViewTreeObserver.GlobalLayout в сочетании с вызовом Measure/Layout на деталях и основных ViewGroups.

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); 
     } 
    } 
} 

Я обновил свой пример кода выше с рабочими изменениями!