【问题标题】:Android: Style ActionMode on AppCompat-v7 with ToolbarAndroid:使用工具栏在 AppCompat-v7 上设置 ActionMode 样式
【发布时间】:2015-02-24 12:40:33
【问题描述】:

我制作了一个带有可选项目的 ListView,但 ActionMode 没有正确显示。 (右侧有一个“比较”菜单按钮,白色)

我尝试使用以下代码设置 actionMode 的样式,但没有任何变化。任何想法为什么会发生这种情况?我发现如果我直接在 Toolbar 小部件而不是 DarkTheme.ActionBar 上设置背景颜色,则 actionMode 上文本周围的颜色消失了,但文本的颜色仍然是白色,而且我还需要 ActionBar 的颜色在主题而不是小部件上定义。

toolbar.xml

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/action_bar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    app:theme="@style/DarkTheme.ActionBar"
    app:popupTheme="@style/DarkTheme.Popup"/>

mytheme.xml

<resources>

<style name="DarkTheme.ActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
    <item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
    <item name="android:textColorSecondary">#ffff8800</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:background">#303030</item>
</style>

<style name="DarkTheme.Popup" parent="ThemeOverlay.AppCompat.Dark">
    <item name="android:textColor">#ffffff</item>
</style>

<style name="DarkTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:textColor">#101010</item>
    <item name="android:textColorLink">#ff0099cc</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="android:colorPrimaryDark">#000000</item>
    <item name="android:navigationBarColor">#000000</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:actionModeStyle">@style/DarkTheme.ActionMode</item>
</style>

<style name="DarkTheme.ActionMode" parent="Widget.AppCompat.ActionMode">
    <item name="android:actionModeBackground">@android:color/black</item>
    <item name="android:background">#000000</item>
    <item name="android:backgroundSplit">#000000</item>
</style>

</resources>

【问题讨论】:

    标签: android android-appcompat android-actionbar-compat android-toolbar android-actionmode


    【解决方案1】:

    我不太懂你的东西,看起来很奇怪。 主题用于清单中的 Activity 或 Application。对于小部件,您应该使用样式。 在查看您的问题时,我认为您只是不知道如何使用主题以及主题的用途。 所以你的主题应该是这样的:

        <resources>
          <style name="AppBlankTheme" parent="Theme.AppCompat.Light.DarkActionBar">
              <!-- Main theme colors -->
              <!--   your app branding color for the app bar -->
              <item name="colorPrimary">@color/primary</item>
              <!--   darker variant for the status bar and contextual app bars -->
              <item name="colorPrimaryDark">@color/primary_dark</item>
              <!--   theme UI controls like checkboxes and text fields -->
            <item name="colorAccent">@color/accent</item>
        </style>
        <!--Both themes below are those accepted to make the ToolBar works-->
        <!-- Base application theme. -->
        <style name="AppTheme" parent="AppBlankTheme">
            <!-- Customize your theme here. -->
            <!-- Base application theme. -->
                <item name="windowNoTitle">true</item>
                <item name="windowActionBar">false</item>
        </style>
        <style name="MyAppTheme" parent="Theme.AppCompat.NoActionBar"/>
    <!--The Theme for the Actvity that have actionMode-->
        <style name="ActionModeAppTheme" parent="AppTheme">
            <item name="windowActionModeOverlay">true</item>
            <item name="actionModeBackground">@color/primary_dark</item>
            <item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
        </style>
    </resources>
    

    那么你的清单看起来像这样:

       <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.android2ee.formation.lollipop.toolbar" >
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:theme="@style/AppTheme" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".sample.ActivityWithItems"
                android:label="@string/title_activity_activity_with_items"
                android:parentActivityName=".MainActivity" >
                <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.android2ee.formation.lollipop.toolbar.MainActivity" />
    
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="com.android2ee.formation.lollipop.toolbar.EXAMPLE" />
                </intent-filter>
            </activity>
            <activity
                android:name=".sample.ActionModeActivity"
                android:label="@string/title_activity_actionmode"
                android:theme="@style/ActionModeAppTheme"
                android:parentActivityName=".MainActivity" >
                <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.android2ee.formation.lollipop.toolbar.MainActivity" />
    
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="com.android2ee.formation.lollipop.toolbar.EXAMPLE" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    你的活动看起来像这样:

    public class ActionModeActivity extends AppCompatActivity {
        ActionMode mMode;
        /**
         * The action Bar
         */
        private ActionBar actionBar;
        private Toolbar toolbar;
        Callback actionModeCallBack;
        private boolean postICS,postLollipop;
        @Override
        protected void onCreate(Bundle savedInstanceState) {        
            super.onCreate(savedInstanceState);
             //You could also hide the action Bar
    //         getSupportActionBar().hide();
            setContentView(R.layout.activity_action_mode);
    
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            toolbar.setNavigationIcon(R.drawable.ic_action_custom_up);
            postICS =getResources().getBoolean(R.bool.postICS);
            postLollipop =getResources().getBoolean(R.bool.postLollipop);
            if(postLollipop){
                toolbar.setElevation(15);
            }
    
            setSupportActionBar(toolbar);
            actionBar=getSupportActionBar();
            actionBar.setDisplayUseLogoEnabled(false);
            actionBar.setDisplayHomeAsUpEnabled(true);
            // Show the Up button in the action bar.
            findViewById(R.id.start_actionmode).setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    enableActionMode();
                }
            });
            findViewById(R.id.stop_actionmode).setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mMode != null) {
                        //To quit the ActionMode
                        mMode.finish();
                    }
                }
            });
    
    
            actionModeCallBack=new  Callback() {
                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    return false;
                }
    
                @Override
                public void onDestroyActionMode(ActionMode mode) {
                }
    
                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                    getMenuInflater().inflate(R.menu.action_mode, menu);
                    return true;
                }
    
                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                    Toast.makeText(ActionModeActivity.this, "Got click: " + item, Toast.LENGTH_SHORT).show();
                    mode.finish();
                    return true;
                }
            };
        }
    
        private void enableActionMode() {
            mMode = startSupportActionMode(actionModeCallBack);
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_activity_with_items, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case android.R.id.home:
                // This ID represents the Home or Up button. In the case of this
                // activity, the Up button is shown. Use NavUtils to allow users
                // to navigate up one level in the application structure. For
                // more details, see the Navigation pattern on Android Design:
                //
                // http://developer.android.com/design/patterns/navigation.html#up-vs-back
                //
                NavUtils.navigateUpFromSameTask(this);
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 2014-12-24
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      相关资源
      最近更新 更多