Я пытаюсь центрировать заголовок страницы в 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
Вы должны найти в своем Android-проекте этот файл toolbar.axml. Просто используйте TextView в качестве заголовка в вашем XML
Вы имеете в виду, что мне нужно добавить TextView и получить к нему доступ из MainActivity? вот так <TextView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "Заголовок панели инструментов" android: layout_gravity = "center" android: id = "@ + id / toolbar_title" />
Это решение может работать, но я не хочу создавать новые темы, а эффекты позволят мне больше контролировать во время выполнения.
гул .. Как насчет того, чтобы проверить, является ли переменная gTextView, преобразовать ее, если это правда, а затем попытаться получить доступ к полю gravity
но у меня нет доступа к гравитации, кроме той, что я пробовал (foregroundGravity и выравнивание текста)
@Greggz, вы могли бы использовать if (g is TextView t), который бы его уже заколдовал. просто небольшое примечание
Включите ViewGroup, когда вы повторяете цикл, и посмотрите, сможете ли вы работать с
@sLw Nicee, довольно круто





Я не уверен, как реализован ваш эффект, но, похоже, работает следующий настраиваемый рендерер (бит, имеющий отношение к центрированию текста, находится в методе 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" на мой вопрос
Название фактически не в центре, если есть значок слева или справа. Не могли бы вы предложить способ их правильного размещения, если на панели инструментов есть дети?
Поцарапайте это, я провел больше тестов. Если заголовок длинный, он по какой-то причине переместится вправо, но если заголовок маленький, он будет правильно центрирован.
Я награждаю этот ответ не потому, что он лучший, а просто для того, чтобы получить значок за ручное начисление баллов. Если у кого-то есть такая же проблема, я советую им использовать настраиваемый макет навигации, который позволит вам создать свой собственный макет на панели инструментов. Подробнее здесь: doumer.me/a-look-at-new-xamarin-forms-features
На 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>
Я пытался использовать стили, но мне было сложно работать с моими изменениями и не реагировать на них.