Перезагрузить XML-макет в Xamarin. Android на изменение ориентации? - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь создать два разных макета для портретного и ландшафтного режима в Xamarin для моего приложения для Android.

Я создал папку макета для портретного режима и макет-страну для ландшафта. Когда я открываю определенную страницу, загружается правильный макет в зависимости от ориентации устройства. Однако, когда я меняю ориентацию, когда страница уже открыта, макет не меняется, а только вращается. Я попытался переопределить OnConfigurationChanged в mainActivity, но я не уверен, как вызвать и загрузить макет только для нужной страницы.

public override void OnConfigurationChanged(Android.Content.Res.Configuration newConfig) 
{
    base.OnConfigurationChanged(newConfig);
    if (newConfig.Orientation == Android.Content.Res.Orientation.Portrait) 
    {
        LayoutInflater li = (LayoutInflater) this.GetSystemService(Context.LayoutInflaterService);
        SetContentView(Resource.Layout.myLayout);
    } 
    else if (newConfig.Orientation == Android.Content.Res.Orientation.Landscape) 
    {
        SetContentView(Resource.Layout.myLayout);
    }
}

Этот код загружает правильный макет при изменении ориентации, ноон вызывается каждый раз, когда изменяется ориентация, и происходит за пределами желаемой страницы, с которой связан этот макет.

1 Ответ

1 голос
/ 01 ноября 2019

В Xamarin.Forms у вас есть такие события, как LayoutChanged и SizeChanged, которые запускаются при изменении Layout Page (включаякогда страница создается и когда изменяется ориентация), это может быть хорошим местом для рассмотрения.

В статье, предложенной ниже @ jgoldberger-MSFT, команда Xamarin рекомендует использовать SizeChanged(подробнее читайте в статье!)

Xamarin.Forms не предлагает никаких собственных событий для уведомления вашего приложения об изменениях ориентации в общем коде. Однако событие SizeChanged страницы вызывается при изменении ширины или высоты страницы.

Внутри ContentPage в Xamarin.Forms вы можетепросто установить (супер базовый пример):

public MainPage()
{
    InitializeComponent();

    SizeChanged += (s,a) =>
    {
        if (this.Width > this.Height ) // or any flag that you use to check the current orientation!
            this.BackgroundColor = Color.Black;
        else
            this.BackgroundColor = Color.White;
    };
}

Обновление:

В Page Renderer в Android вы все еще можете использовать аналогичный LayoutChange обработчик :

class Class1 : PageRenderer
{

    public Class1(Context context) : base(context)
    {
        LayoutChange += (s, a) =>
        {

        };
    }
}

Надеюсь, это полезно ...

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