Xamarin.Forms: обновление с 2.3.4 до 3.0 привело к тому, что содержимое Android вышло за пределы - PullRequest
0 голосов
/ 25 мая 2018

Мне пришлось обновить летнее приложение до текущей версии форм.К сожалению, на Android кажется, что экран выше, чем на самом деле (см. Снимок экрана).Все работает нормально для iOS, но все мои страницы немного выше экрана на Android на нескольких устройствах.

enter image description here

Некоторые вещи, которые я пробовал:

  • Убедитесь, что я использую последние SDK и последние файлы поддержки Android
  • Взломан в paddingEv
  • Обновлены все мои пользовательские средства визуализации с помощью новых конструкторов Android

Описание макета: Зависит от идиомы: на телефоне это MasterDetail с страницей с вкладками в качестве детализации, страница навигации для первого дочернего элемента страницы с вкладками (поэтому меню отображается только для этой страницы)и контент-страницы для отдыха.Для планшета все дочерние страницы с вкладками являются страницами содержимого.Все модальные страницы являются страницами контента.

Любая помощь, даже диагностическая, будет принята с благодарностью.

ОБНОВЛЕНИЕ:

Мой текущий взлом заключается в настройке отступов в специальном рендеревот так:

public class HackLayoutShiftFixRenderer : MasterDetailPageRenderer
{
    public HackLayoutShiftFixRenderer(Context context) : base(context)
    {
    }

    protected override void OnElementChanged(VisualElement oldElement, VisualElement newElement)
    {
        base.OnElementChanged(oldElement, newElement);

        if (!(newElement is MasterDetailPage masterDetail)) return;

        masterDetail.Master.Padding = new Thickness(0, 0, 0, 24);
        masterDetail.Detail.Padding = new Thickness(0, 0, 0, 24);
    }
}

И я делаю нечто подобное с модальными страницами.Число 24 использовалось методом проб и ошибок.

1 Ответ

0 голосов
/ 30 мая 2018

Я нашел ответ, но не возражал бы против некоторых объяснений, почему это произошло.

Год назад это было реализовано, чтобы исправить клавиатуру, скрывающую элементы поиска в ListView: http://xamarinformscorner.blogspot.com/2016/06/soft-keyboard-hiding-entries-fields-in.html

Код на случай, если ссылка исчезнет:

public class AndroidBug5497WorkaroundForXamarinAndroid
{

    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

    // CREDIT TO Joseph Johnson (http://stackoverflow.com/users/341631/joseph-johnson) for publishing the original Android solution on stackoverflow.com

    public static void assistActivity(Activity activity)
    {
        new AndroidBug5497WorkaroundForXamarinAndroid(activity);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;

    private AndroidBug5497WorkaroundForXamarinAndroid(Activity activity)
    {
        FrameLayout content = (FrameLayout)activity.FindViewById(global::Android.Resource.Id.Content);
        mChildOfContent = content.GetChildAt(0);
        ViewTreeObserver vto = mChildOfContent.ViewTreeObserver;
        vto.GlobalLayout += (object sender, EventArgs e) => {
            possiblyResizeChildOfContent();
        };
        frameLayoutParams = (FrameLayout.LayoutParams)mChildOfContent.LayoutParameters;
    }

    private void possiblyResizeChildOfContent()
    {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious)
        {
            int usableHeightSansKeyboard = mChildOfContent.RootView.Height;
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;

            frameLayoutParams.Height = usableHeightSansKeyboard - heightDifference;

            mChildOfContent.RequestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight()
    {
        Rect r = new Rect();
        mChildOfContent.GetWindowVisibleDisplayFrame(r);
        if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
        {
            return (r.Bottom - r.Top);
        }
        return r.Bottom;
    }

Проблема была в функции "computeUsableHeight": по крайней мере, в последней версии я всегда должен принимать разницу междуверх и низ в расчет.Я не знаю, почему или когда это изменилось между Xamarin.Forms 2.3.4 и 3.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...