Xamarin: фоновое изображение панели навигации на Android - PullRequest
0 голосов
/ 03 декабря 2018

В пользовательской навигации я получаю фоновое изображение для навигации в части iOS, используя:

NavigationBar.BarTintColor = UIColor.FromPatternImage(UIImage.FromFile("my_image"));

успешно.

Как я могу получить то же самое на своем пользовательском классе Android?Пока я получаю только цвет фона на Android:

        MyCustomNavigation.BarBackgroundColor = Color.FromHex("#COD_HEX");

(обратите внимание, что мне нужно пользовательское изображение только для некоторых видов, а не глобально)

1 Ответ

0 голосов
/ 06 декабря 2018

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

Прежде всего, вы можете создать новый класс, расширяющий NavigationPage и скопировать изображение в папку «drawable» в проекте Android.

 public class MyCustomNavigation : NavigationPage
{
    public MyCustomNavigation(Page page) : base(page)
    {

    }
    public static readonly BindableProperty BarBackgroundProperty = BindableProperty.CreateAttached(
        "BarBackground",
        typeof(string),
        typeof(MyCustomNavigation), string.Empty);

    public static string GetBarBackground(BindableObject view)
    {

        return (string)view.GetValue(BarBackgroundProperty);
    }

    public static void SetBarBackground(BindableObject view, string value)
    {
        view.SetValue(BarBackgroundProperty, value);
    }

}

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

    [XamlCompilation(XamlCompilationOptions.Compile)]
public partial class BarBackgroundPage : ContentPage
{
    public BarBackgroundPage ()
    {
        InitializeComponent();
        Title = "Monkey Title";
        MyCustomNavigation.SetBarBackground(this, "monkeybackground");

    }
}

В конце концов, вы можете создать класс CustomNavigationPageRenderer в папке Renderers проекта Android.

[assembly: ExportRenderer(typeof(MyCustomNavigation), typeof(CustomNavigationPageRenderer))]
namespace App4.Droid.Renderers
{
    public class CustomNavigationPageRenderer : NavigationPageRenderer
    {
        Android.Support.V7.Widget.Toolbar _toolbar;
        Drawable _originalToolbarBackground;
        Drawable _originalWindowContent;
        Android.Widget.FrameLayout _parentLayout;


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


    }

    protected override void SetupPageTransition(Android.Support.V4.App.FragmentTransaction transaction, bool isPush)
    {
        Page lastPage = null;
        if (isPush)
        {
            lastPage = Element?.Navigation?.NavigationStack?.Last();
            lastPage.PropertyChanged += LastPage_PropertyChanged;
        }
    }

    private void LastPage_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        var lastPage = sender as Page;
        UpdateToolbarBackground(_toolbar, lastPage, Context as Activity, _originalToolbarBackground);
    }

    private void UpdateToolbarBackground(Android.Support.V7.Widget.Toolbar toolbar, Page lastPage, Activity activity, Drawable originalToolbarBackground)
    {

        string Picname = MyCustomNavigation.GetBarBackground(lastPage);
        int resid = this.Context.Resources.GetIdentifier(Picname, "drawable", Android.App.Application.Context.PackageName);

         toolbar.SetBackgroundResource(resid);
    }
    public override void OnViewAdded(Android.Views.View child)
    {
        base.OnViewAdded(child);
        if(child.GetType()==typeof(Android.Support.V7.Widget.Toolbar))
        {
            var lastPage = Element?.Navigation?.NavigationStack?.Last();
            _toolbar = (Android.Support.V7.Widget.Toolbar)child;
            _originalToolbarBackground = _toolbar.Background;
            var originalContent = (Context as Activity)?.Window?.DecorView?.FindViewById<FrameLayout>(Window.IdAndroidContent);
            if (originalContent != null)
            {
                _originalWindowContent = originalContent.Foreground;
            }

            _parentLayout = new Android.Widget.FrameLayout(_toolbar.Context)
            {
                LayoutParameters = new Android.Widget.FrameLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent)
            };
        }
    }
}
}

Если вы хотите узнать больше информации о костюмах Navigation, вы можете открыть эту ссылку и скачайте проект.

...