【问题标题】:colorPrimary and colorPrimaryDark are ignored within application themecolorPrimary 和 colorPrimaryDark 在应用程序主题中被忽略
【发布时间】:2015-05-26 17:05:29
【问题描述】:

(注意:这与When using ActionMode, the status bar turns black on Lollipop 有点相关,因此我可能不小心从这个问题中省略了一些附加信息)

我定义了以下主题:

<style name="Material" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/app_green</item>
    <item name="colorPrimaryDark">@color/app_green_dark</item>

    <item name="android:textColorPrimary">@color/action_bar_text</item>
    <item name="android:textColor">@color/secondary_text_color</item>
    <item name="android:color">@color/secondary_text_color</item>

    <item name="colorAccent">@color/app_green</item>
    <item name="android:editTextColor">@color/secondary_text_color</item>

    <item name="textHeaderMaxLines">@integer/text_header_max_lines</item>
    <item name="trackAbstractMaxLines">@integer/track_abstract_max_lines</item>
    <item name="activatableItemBackground">@drawable/activatable_item_background</item>

    <!-- ActionMode Styles -->
    <item name="android:windowActionModeOverlay">true</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="actionModeStyle">@style/Material.Widget.ActionMode</item>

    <!-- Global UI Assignments -->
    <item name="android:spinnerStyle">@style/Material.Widget.Spinner</item>

    <item name="android:buttonStyle">@style/Material.Widget.Button</item>
    <item name="android:checkboxStyle">@style/Material.Widget.Checkbox</item>
    <item name="android:textAppearance">@android:style/TextAppearance</item>

    <item name="android:popupWindowStyle">@style/Material.Window.Popup</item>

    <!-- ViewPager -->
    <item name="vpiCirclePageIndicatorStyle">@style/Material.Activity.Login.ViewPagerIndicator.CustomCircle</item>
    <item name="buttonBarStyle">?android:buttonBarStyle</item>
    <item name="buttonBarButtonStyle">?android:buttonBarButtonStyle</item>
    <item name="indeterminateProgressStyle">?android:indeterminateProgressStyle</item>

    <!-- API 14+ (compatibility) -->
    <item name="listPreferredItemPaddingLeft">@dimen/compat_list_preferred_item_padding_left</item>
    <item name="listPreferredItemPaddingRight">@dimen/compat_list_preferred_item_padding_right</item>
    <item name="listPreferredItemHeightSmall">@dimen/compat_list_preferred_item_height_small</item>
</style>

我使用这个主题如下:

<application
    android:name=".MyApp"
    android:icon="@drawable/icon"
    android:logo="@null"
    android:label="@string/app_name"
    android:theme="@style/Material"
    android:hardwareAccelerated="true"
    android:allowBackup="true">
    <activity
        android:name=".ui.MainActivity"
        android:label="@string/title_activity_main">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ui.DetailActivity"
        android:label="Details"
        android:theme="@style/Material.Activity" >
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable"/>
    </activity>
</application>

我所有的活动都来自NavigationDrawerActivity

/**
 * An {@link Activity} that supports a Navigation Drawer, which is a pull-out panel for navigation
 * menus. This drawer is pulled out from the left side of the screen (right side on RTL devices).
 */
public class NavigationDrawerActivity extends ActionBarActivity
  implements AdapterView.OnItemClickListener {

  private static final String LOGTAG = NavigationDrawerActivity.class.getSimpleName();

  private DrawerLayout mDrawerLayout;
  private ListView mDrawerList;
  private LayoutInflater mInflater;
  private NavigationDrawerItemAdapter mAdapter;
  private ActionBarDrawerToggle mDrawerToggle;

  private NavigationDrawerItem[] mNavigationDrawerItems;

  private Toolbar mAppBar;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// We have to call super.setContentView() here because BaseActivity redefines setContentView(),
// and we don't want to use that.
super.setContentView(R.layout.navigation_drawer);

mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    setupNavigationDrawer();
  }

  @Override
  protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);

    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
  }

  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    switch(id) {
      case android.R.id.home:
        return mDrawerToggle.onOptionsItemSelected(item);
    }

    return super.onOptionsItemSelected(item);
  }

  /**
   * Toggles the state of the navigation drawer (i.e. closes it if it's open, and opens it if
   * it's closed).
   */
  public void toggleNavigationDrawer() {
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
      closeNavigationDrawer();
    } else {
      openNavigationDrawer();
    }
  }

  /**
   * Opens the navigation drawer.
   */
  public void openNavigationDrawer() {
    mDrawerLayout.openDrawer(GravityCompat.START);
  }

  /**
   * Closes the navigation drawer.
   */
  public void closeNavigationDrawer() {
    mDrawerLayout.closeDrawer(GravityCompat.START);
  }

  /**
   * Initializes items specific to the navigation drawer.
   */
  private void setupNavigationDrawer() {
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.wiw_green));

        mAppBar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(mAppBar);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setDisplayShowHomeEnabled(false);

        mDrawerToggle = new ActionBarDrawerToggle(
          this,                  /* Our context (Activity that hosts this drawer) */
          mDrawerLayout,         /* The DrawerLayout where the nav drawer will be drawn */
          R.string.drawer_open,  /* Description of "open drawer", for accessibility */
          R.string.drawer_close  /* Description of "close drawer", for accessibility */
        ) {

          /**
           * Called when a drawer has settled in a completely closed state.
           */
          public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            supportInvalidateOptionsMenu();
          }

          /**
           * Called when a drawer has settled in a completely open state.
           */
          public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            supportInvalidateOptionsMenu();
          }
        };

        mDrawerList = (ListView) mDrawerLayout.findViewById(R.id.drawer_list);

        mNavigationDrawerItems = buildNavDrawerItemsList();

        setupAdapter(mNavigationDrawerItems);

        setupNavigationDrawerHeader();

        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerList.setOnItemClickListener(this);
      }

      @Override
      public void onItemClick(AdapterView<?> parent, View aView, int aPosition, long aId) {
        // Code not relevant
      }

      /**
       * Set the inner content view of this {@link NavigationDrawerActivity} to have a given layout.
       *
       * @param aLayoutId The id of the layout to load into the inner content view of this activity.
       */
      public void setDrawerContent(int aLayoutId) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ViewGroup root = (ViewGroup)findViewById(R.id.drawer_content);
        inflater.inflate(aLayoutId, root);
      }  
    }

NavigationDrawerActivity 中,我实际上必须手动设置状态栏背景颜色(参见setupNavigationDrawer() 的第二行),而不是在Android 5.0 设备上从colorPrimaryDark 自动设置。此外,更改colorPrimarycolorPrimaryDark 中的颜色不会更改状态栏的颜色(尽管这可能是windowTranslucentStatus 设置为true 的影响)或Toolbar 背景颜色。

我想知道我能做些什么来缓解这个问题,因为我认为这会导致我的 Material-esque 主题出现其他问题。

【问题讨论】:

标签: android android-actionbar android-statusbar


【解决方案1】:

您引用的文档指的是原生 Android 5.0 Theme.Materialappcompat-v7 似乎不会自动将任何颜色应用于状态栏,至少目前是这样。

因此,例如,this sample project 在 Android 5.0 设备上运行时会获取状态栏颜色,因为它使用的是Theme.MaterialThis port of the same sample project 不使用 appcompat-v7This revised version of the same sample 使用 appcompat-v7 并专门请求状态栏颜色更改获取颜色。

【讨论】:

  • 那么,如果使用抽屉式导航,这种自动样式根本不起作用,因为您必须从AppCompat 主题派生?
  • 请参阅stackoverflow.com/questions/22301924/… 了解我的意思
  • @jwir3:您不需要使用appcompat-v7 来使用导航抽屉。 DrawerLayout 本身适用于任何活动。与本机操作栏一起使用的原始ActionBarDrawerToggle 已被弃用,替换需要appcompat-v7。所以如果要使用官方非弃用的toggle,就必须使用appcompat-v7,也就是说你必须自己设置状态栏颜色。就个人而言,我会克隆 appcompat-v7 ActionBarDrawerToggle 并将其移植到本机操作栏上,就像我对 MediaRouteActionProvider 所做的那样,但这只是我。 :-)
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 2015-09-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
相关资源
最近更新 更多