Изменение цвета ActionBar в фрагменте

В Xamarin, как я могу изменить цвет фона ActionBar и цвет текста в Fragment?

Вот код, который работает в Activity:

ColorDrawable colorDrawable = new ColorDrawable(Color.White);
ActionBar.SetBackgroundDrawable(colorDrawable); 

int titleId = Resources.GetIdentifier("action_bar_title", "id", "android");
TextView abTitle = (TextView) FindViewById(titleId);
abTitle.SetTextColor (Color.Black);

Если у меня есть тот же код, для того же проекта, в Fragment, я получаю следующую ошибку:

Ссылка на объект требуется для нестатического поля, метода или имущество 'Android.App.ActionBar.SetBackgroundDrawable(Android.Graphics.Drawables.Drawable)'

В этой строке кода:

ActionBar.SetBackgroundDrawable(colorDrawable);

И если я прокомментирую вышеприведенную строку кода, я получаю эту ошибку:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта

В этой строке кода:

abTitle.SetTextColor (Color.Black);

Кроме того, я помещаю этот код в функцию OnCreateView.

Как код необходимо изменить, чтобы он работал в Fragment, а не в Activity?

Заранее спасибо

Ответ 1

Я обнаружил, что для этого мне нужно манипулировать панель действий из действия

Вот код:

public override void OnAttach(Activity activity)
{
    base.OnAttach(activity);
    var colorDrawable = new ColorDrawable(Color.White);
    activity.ActionBar.SetBackgroundDrawable(colorDrawable);

    var titleId = activity.Resources.GetIdentifier("action_bar_title", "id", "android");
    var abTitle = activity.FindViewById<TextView>(titleId);
    abTitle.SetTextColor(Color.Black);
}

Ответ 2

В Fragment представление ActionBar обычно обрабатывается путем переопределения:

public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)

метод обратного вызова; после того, как вы вызвали SetHasOptionsMenu(true); в OnCreate().

Возможно, вы получаете этот NullReferenceException, потому что OnCreateView() вызывается до того, как макет ActionBar был завышен.

Как правило, это будет выглядеть мой метод:

public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)
{
    //Stops the menu being reinflated on configuration changes
    if(!menu.HasVisibleItems) 
        inflater.Inflate(Resource.Menu.MenuLayout, menu);

    var myMenuItem = menu.FindItem(Resource.Id.MyMenuItem);
    //Do stuff with your menu items
}

Ответ 3

Вы можете получить доступ к Activity from the Fragment, используя свойство Activity в любое время, что будет возвращать действие, связанное с фрагментом.