更改操作栏的颜色在ICS中不起作用

时间:2014-02-22 18:00:18

标签: android android-actionbar

我正在使用以下代码更改操作栏的颜色。

            actionBar= getSupportActionBar();
            actionBar.setBackgroundDrawable(new ColorDrawable(backgroundColor));

这在onCreate()方法中完全正常(即我的活动开始时)。

但是当我在 Android 4.1 中使用相同的代码来更改onClick()方法中的操作栏颜色时(即当用户点击说出一个按钮时),它会将操作栏的颜色更改为'white'只是backgroundColor的值。

Android 2.3 中,无论是从onCreate还是onClick()调用,它都可以完美地运行。

对我来说似乎是死路一条。

4 个答案:

答案 0 :(得分:2)

对于 Android 4.0 似乎 Android 4.1 (4.2就可以了),您无法在活动开始后更改操作栏背景。

所以我想在这些情况下的解决方案是使用不同的背景颜色重新启动活动。

不是很优雅,但这是我能想到的最好的。

或许这样的事情:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    Button btn = (Button) findViewById(R.id.btn);

    if (getIntent().hasExtra("color")) {
      getSupportActionBar().setBackgroundDrawable(
          new ColorDrawable(getIntent().getIntExtra("color", 0)));
    }

    btn.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {

        Intent it = getIntent();
        it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        it.putExtra("color", Color.BLUE);
        startActivity(it);

      }
    });
  }

答案 1 :(得分:1)

我用来解决此问题的解决方法是维护对最初用于设置背景的ColorDrawable的引用。然后,要更改其颜色,请修改Drawable的颜色,然后告诉活动使其选项无效,这会导致重绘ActionBar。这是我设置操作栏颜色的代码:

ColorDrawable sBackgroundDrawable;
...
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
protected void setActionBarColor(int color){
    if(getSherlockActivity() != null && !mCallback.isNavDrawerShowing()){
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN){
            if(sBackgroundDrawable == null){
                sBackgroundDrawable = new ColorDrawable(color);
                getSherlockActivity().getSupportActionBar().setBackgroundDrawable(sBackgroundDrawable);
            }else{
                sBackgroundDrawable.setColor(color);
                getSherlockActivity().invalidateOptionsMenu();
            }
        }else{
            getSherlockActivity().getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color));
        }
    }
}

答案 2 :(得分:0)

根据steve_the_kid提到的内容,我可以通过保存颜色可绘制来解决这个问题。

ColorDrawable actionBarBackground = new ColorDrawable();

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getActionBar().setBackgroundDrawable(actionBarBackground());
  actionBarBackground.setColor(someColor);
}

void onSomethingClick() {
  actionBarBackground.setColor(someOtherColor);
}

答案 3 :(得分:0)

很抱歉这么晚的回复,但为了帮助别人,我很久以后就回答了这个问题。

只需设置操作栏的标题或在图标或菜单中进行更改以及更改colorDrawables。简单的更改将使用新颜色重新创建操作栏。即使每次设置相同的标题需要相同的标题或图标或相同的图标。

我希望这会有助于其他人