【问题标题】:Change ActionBar color in a Fragment在 Fragment 中更改 ActionBar 颜色
【发布时间】:2014-07-22 11:32:18
【问题描述】:

在 Xamarin 中,如何更改 Fragment 中的 ActionBar 背景颜色和文本颜色?

这是在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 中工作?

提前致谢

【问题讨论】:

    标签: android android-fragments colors android-actionbar xamarin


    【解决方案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】:

      您可以随时使用 Activity 属性从 Fragment 访问 Activity,即 将返回与 Fragment 关联的 Activity。

      【讨论】:

        【解决方案3】:

        Fragment 中,ActionBar 视图通常通过覆盖:

        public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)
        

        回调方法;在确保您在OnCreate() 中调用了SetHasOptionsMenu(true);

        您可能会收到 NullReferenceException,因为在 ActionBar 布局膨胀之前调用了 OnCreateView()。

        通常,这就是我的方法的样子:

        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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-02
          相关资源
          最近更新 更多