Центр панели инструментов Android с использованием эффектов в формах Xamarin

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

var context = (Android.App.Activity)Forms.Context; var toolbar = context.Resources.GetIdentifier("toolbar", "id", context.PackageName); var view = context.FindViewById(toolbar);

Я пробовал следующее:

Передний планГравитация

view.SetForegroundGravity(GravityFlags.Center);

Выравнивание текста

view.TextAlignment = Android.Views.TextAlignment.Center;

Получите доступ к дочерним элементам панели инструментов и установите направление и выравнивание.

if (view is ViewGroup)
{
    var g = view as ViewGroup;

    for (var i = 0; i < g.ChildCount; i++)
    {
        SetTypefaceToAllTextViews(g.GetChildAt(i), typeface);
        g.GetChildAt(i).TextAlignment = Android.Views.TextAlignment.Center;
        g.GetChildAt(i).TextDirection = TextDirection.Rtl;

    }
}

Проблема в том, что у меня нет прямого доступа к серьезности названия.


РЕДАКТИРОВАТЬ № 1:

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

if (view is TextView)
{
    var tv = view as TextView;
    tv.Typeface = typeface;
    tv.TextAlignment = Android.Views.TextAlignment.Center;
    tv.Gravity = GravityFlags.CenterHorizontal;
}

РЕДАКТИРОВАТЬ № 2: Я смог добавить к эффекту следующее, основываясь на приведенном ниже ответе, и он каким-то образом центрировал элемент, но не точно по центру. Каким-то образом он находится справа от центра, если только на панели инструментов справа и слева не будет 2 значков, тогда заголовок будет действительно центрирован. Проверено на Android 8. Кроме того, я обнаружил эту проблему в аналогичном решении.

https://github.com/CrossGeeks/CustomNavigationBarSample/issues/3

Я пытался использовать стили, но мне было сложно работать с моими изменениями и не реагировать на них.

Ali123 23.07.2018 10:30

Вы должны найти в своем Android-проекте этот файл toolbar.axml. Просто используйте TextView в качестве заголовка в вашем XML

Greggz 23.07.2018 10:31

Вы имеете в виду, что мне нужно добавить TextView и получить к нему доступ из MainActivity? вот так <TextView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "Заголовок панели инструментов" android: layout_gravity = "center" android: id = "@ + id / toolbar_title" />

Ali123 23.07.2018 10:34

Это решение может работать, но я не хочу создавать новые темы, а эффекты позволят мне больше контролировать во время выполнения.

Ali123 23.07.2018 10:34

гул .. Как насчет того, чтобы проверить, является ли переменная gTextView, преобразовать ее, если это правда, а затем попытаться получить доступ к полю gravity

Greggz 23.07.2018 10:38

но у меня нет доступа к гравитации, кроме той, что я пробовал (foregroundGravity и выравнивание текста)

Ali123 23.07.2018 10:45

@Greggz, вы могли бы использовать if (g is TextView t), который бы его уже заколдовал. просто небольшое примечание

sLw 23.07.2018 10:46

Включите ViewGroup, когда вы повторяете цикл, и посмотрите, сможете ли вы работать с

Greggz 23.07.2018 10:47

@sLw Nicee, довольно круто

Greggz 23.07.2018 10:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
9
697
2

Ответы 2

Я не уверен, как реализован ваш эффект, но, похоже, работает следующий настраиваемый рендерер (бит, имеющий отношение к центрированию текста, находится в методе ToolbarChildAdded):

public class CustomNavigationPageRenderer : NavigationPageRenderer
{
    Android.Support.V7.Widget.Toolbar toolbar;

    public CustomNavigationPageRenderer(Context context) : base(context)
    {
    }

    protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
    {
        base.OnElementChanged(e);

        if (e.OldElement != null)
        {
            this.toolbar.ChildViewAdded -= ToolbarChildAdded;
        }

        if (e.NewElement != null)
        {
            var toolbarId = Context.Resources.GetIdentifier("toolbar", "id", Context.PackageName);
            this.toolbar = this.FindViewById(toolbarId) as Android.Support.V7.Widget.Toolbar;
            this.toolbar.ChildViewAdded += ToolbarChildAdded;
        }
    }

    private void ToolbarChildAdded(object sender, ChildViewAddedEventArgs e)
    {
        if (e.Child is Android.Support.V7.Widget.AppCompatTextView tv)
        {
            // identify the title text view and center it
            tv.LayoutParameters = new Android.Support.V7.Widget.Toolbar.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent, (int)GravityFlags.CenterHorizontal);
        }
    }
}

Спасибо за ответ, пожалуйста, отметьте "Редактировать # 2" на мой вопрос

Ali123 26.07.2018 07:38

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

Ali123 27.07.2018 14:19

Поцарапайте это, я провел больше тестов. Если заголовок длинный, он по какой-то причине переместится вправо, но если заголовок маленький, он будет правильно центрирован.

Ali123 27.07.2018 16:37

Я награждаю этот ответ не потому, что он лучший, а просто для того, чтобы получить значок за ручное начисление баллов. Если у кого-то есть такая же проблема, я советую им использовать настраиваемый макет навигации, который позволит вам создать свой собственный макет на панели инструментов. Подробнее здесь: doumer.me/a-look-at-new-xamarin-forms-features

Ali123 01.08.2018 08:19

На Android заголовок не центрирован, слева есть поле 16dp. Любая попытка центрировать контент должна будет это учитывать.

Это значение проще сбросить с помощью настраиваемого средства визуализации.

protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
{
    base.OnElementChanged(e);

    if (e.NewElement != null)
    {
        var toolbarId = Context.Resources.GetIdentifier("toolbar", "id", Context.PackageName);
        var toolbar = this.FindViewById(toolbarId) as Android.Support.V7.Widget.Toolbar;
        if (toolbar != null) toolbar.SetContentInsetsAbsolute(0, 0);
    }
}

Убедитесь, что макет панели инструментов правильно указан в вашем основном действии.

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        //etc
    }
}

Как только это будет сделано, проще всего использовать Absolute Layout, чтобы расположить элементы так, как вы хотели бы, внутри представления заголовка.

<NavigationPage.TitleView>
    <AbsoluteLayout
        Padding = "0"
        Margin = "10,0,10,0">

        <Image
            AbsoluteLayout.LayoutBounds = "0.5,0.5,130,31"
            AbsoluteLayout.LayoutFlags = "PositionProportional"
            Source = "logowhite.png">
        </Image>

        <ImageButton
            AbsoluteLayout.LayoutBounds = "1,0.5,32,32"
            AbsoluteLayout.LayoutFlags = "PositionProportional"
            Margin = "0"
            WidthRequest = "32"
            Source = "settingsicon.png"
            Clicked = "OnImageButtonClicked">
        </ImageButton>

    </AbsoluteLayout>
</NavigationPage.TitleView>

Другие вопросы по теме