【问题标题】:Change spinner style in toolbar在工具栏中更改微调器样式
【发布时间】:2014-11-04 15:33:58
【问题描述】:

我正在尝试在我的 Toolbar 中添加一个微调器,就像旧的 ActionBar 样式导航一样,我的主题是这个

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/color_primary</item>
    <item name="colorPrimaryDark">@color/color_primary_dark</item>
    <item name="colorAccent">@color/color_primary</item>
</style>

但是我的微调器是黑色的,而所有其他图标和溢出菜单都是白色的,所以看起来很糟糕

我尝试使用此更改微调器的样式

<style name="ToolbarSpinnerTheme" parent="Theme.AppCompat">
    <item name="android:spinnerItemStyle">@style/TextAppearanceSpinnerItem</item>
</style>

<style name="TextAppearanceSpinnerItem">
    <item name="android:textColor">#FFFFFF</item>
</style>

这就是我的工具栏的样式

<android.support.v7.widget.Toolbar
           android:id="@+id/toolbar"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:minHeight="?attr/actionBarSize"
           android:background="?attr/colorPrimary"
           app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
           app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

           <Spinner
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:id="@+id/modes"
               android:minWidth="150dp"
               android:gravity="bottom"
               style="@style/ToolbarSpinnerTheme"/>

       </android.support.v7.widget.Toolbar>


final Spinner mode = (Spinner)findViewById(R.id.modes);

    SpinnerAdapter mSpinner = ArrayAdapter.createFromResource(this, R.array.action_bar_spinner, android.R.layout.simple_spinner_dropdown_item);
    mode.setAdapter(mSpinner);

但它总是保持黑色。如何将微调器箭头和文本更改为白色,同时仍保持与 Light 主题相同的下拉样式主题?

更新 4.4 箭头修复:

我让箭头变白的唯一方法是以编程方式而不是在 xml 中添加微调器,所以它看起来像这样

final ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(),
        R.array.main_navigation_list, R.layout.spinner_text);
spinnerAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
mNavigationTags = getResources().getStringArray(R.array.main_navigation_list);


mNavigationSpinner = new Spinner(getSupportActionBar().getThemedContext());
mNavigationSpinner.setAdapter(spinnerAdapter);

mNavigationSpinner.setOnItemSelectedListener(this);
mToolbar.addView(mNavigationSpinner)

【问题讨论】:

  • 能否贴出创建适配器和微调器的代码?
  • @KevinvanMierlo 我看不出这有什么帮助,但它就在那里
  • 您也可以发布微调器 xml 吗?
  • @KevinvanMierlo 再次编辑
  • 看到这个类似的问题stackoverflow.com/questions/26852108/…

标签: android android-spinner


【解决方案1】:

我是这样做的:

navigation_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/toolbar"
android:layout_width="fill_parent"
android:layout_height="?attr/actionBarSize"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
</android.support.v7.widget.Toolbar>

MainActivity.java

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.pass_type, R.layout.layout_drop_title);
 adapter.setDropDownViewResource(R.layout.layout_drop_list);

 Spinner mNavigationSpinner = new Spinner(getSupportActionBar().getThemedContext());
 mNavigationSpinner.setAdapter(adapter);
 getToolbar().addView(mNavigationSpinner);

你会发现我使用了自定义微调器项目布局,layout_drop_titlelayout_drop_list

layout_drop_title.xml

 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@android:id/text1"
    style="?attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:textColor="@color/white"
    android:ellipsize="marquee"/>

layout_drop_list.xml

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:ellipsize="marquee"
android:background="@color/nliveo_blue_colorPrimary"
android:textColor="@color/white"/>

【讨论】:

  • 谢谢你的编辑,我不熟悉stackoverflow的编辑框,我会摸索
  • 太棒了,android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 是箭头键
【解决方案2】:

Kevin 的方向是正确的,但真正的答案不是使用应用程序上下文,而是使用操作栏本身已经主题化的上下文。这实际上在documenation 中提到过,但一直没有得到那么强调:

对要在操作栏上显示的任何内容进行充气时(例如 SpinnerAdapter 用于工具栏中的列表导航),请确保使用 操作栏的主题上下文,通过以下方式检索 getSupportActionBar().getThemedContext()。

【讨论】:

  • 我刚刚尝试使用ThemeContext,但仍然没有改变箭头的颜色
【解决方案3】:

当你创建 arrayadapter 时,你应该做 getApplicationContext 而不是这个:

SpinnerAdapter mSpinner = ArrayAdapter.createFromResource(getApplicationContext(), R.array. action_bar_spinner, android.R.layout.simple_spinner_dropdown_item);

制作一个新的布局文件:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
                 android:id="@android:id/text1"
                 style="?android:attr/spinnerDropDownItemStyle"
                 android:singleLine="true"
                 android:layout_width="match_parent"
                 android:layout_height="?android:attr/listPreferredItemHeight"
                 android:ellipsize="marquee"
                 android:textColor="#000000"/>

然后将您的代码更改为:

ArrayAdapter mAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array. action_bar_spinner, android.R.layout.simple_spinner_dropdown_item);
        mAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
        mode.setAdapter(mAdapter);

您是否尝试过像这样将微调器放入 xml 文件中:

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:background="?attr/colorPrimary">

    <Spinner
            android:id="@+id/spinner_nav"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

</android.support.v7.widget.Toolbar>

并且还像这样禁用标题:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

回答来自 Chris Banes:https://stackoverflow.com/a/26511653/2767703

【讨论】:

  • 这与我的问题无关,我想知道如何改变我的微调器的样式
  • @tyczj 样式可能会被着色错误,因为没有通货膨胀。通过将 Spinner 放在您的 xml 中,它可能会正确膨胀并给出您想要的白色文本
  • 我的工具栏中有微调器,所以这又不是手头的问题
  • @tyczj 我改了答案,看看。我不知道默认主题不起作用,但这应该是微调器的样式
  • @tyczj 我正在自己的项目中尝试,这就是我花了这么长时间的原因
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多