gpt4 book ai didi

android - 如何修复放置在工具栏顶部的 Android 4.x 微调器样式

转载 作者:IT王子 更新时间:2023-10-28 23:44:39 27 4
gpt4 key购买 nike

根据Android documentation , Spinner 小部件支持 Material Design 样式。

所以我决定在我的应用中使用它,将它放在工具栏的顶部。

layout/activity_base.xml

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

Activity 主题

<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/omni_primary_color</item>
<item name="colorPrimaryDark">@color/omni_primary_color_dark</item>
<item name="colorAccent">@color/omni_accent_color</item>
</style>

BaseActivity.java

public class BaseActivity extends ActionBarActivity {

@InjectView(R.id.my_awesome_toolbar)
Toolbar mToolbar;

@InjectView(R.id.spinner)
Spinner spinner;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
ButterKnife.inject(this);
//setup toolbar
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
mToolbar.setNavigationIcon(R.drawable.ic_action_navigation_menu);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mToolbar.getContext(),
R.array.planets_array, R.layout.support_simple_spinner_dropdown_item);
adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
}

在 Lollipop 微调器和下拉菜单上看起来不错,尽管下拉菜单的背景颜色是黑色,而菜单下拉菜单是白色的。我猜 app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 没有传播到微调器。

Android 5.0

enter image description here enter image description here

现在最大的问题是在 Android 4.x 中,下拉背景颜色为白色(popupTheme 已传播?),而微调器旁边的图标为黑色。

Android 4.4

enter image description here

如何在 XML 中正确设置它或在代码中实现它以使其在 Android 5 和 4 上都可以工作?理想情况下,我希望两者看起来都像在 Android 5 上,但带有白色微调器下拉菜单(如设置菜单下拉菜单)。

更新

我注意到设置属性 colorControlNormal 会影响微调器的过滤器图标。如果有人发现如何将其用于 Spinner(不更改其他内容控件),那么我的解决方案将把该发现与 @Sven 答案结合起来。

更新

以下更改修复了微调器文本和弹出颜色的问题。所以最终解决方案的唯一问题是过滤器图标。

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(),
R.array.planets_array, R.layout.support_simple_spinner_dropdown_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

更新

我发现过滤器图标实际上是为微调器指定的 android:background 的一部分,它是透明的。提供自己的背景可以解决它,例如

<item name="android:background">?android:selectableItemBackground</item>

谜团解开!

最后一 block 拼图是 Android 5 上的弹出窗口,它有黑色背景和白色文本,但我想它可以通过自定义布局来解决。如果没有人提供完整的答案,我会自己做并标记为已接受。

最佳答案

我知道这已经很晚了,但是当我自己遇到这个问题时我遇到了这个问题,我在 BrowseSessionsActivity 中找到了解决方案的Google I/O 2014 app并对其进行了改编。

布局

toolbar_spinner.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">

<Spinner
android:id="@+id/toolbar_spinner"
style="@style/Widget.MyApp.HeaderBar.Spinner"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>

</LinearLayout>

toolbar_spinner_item_actionbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="8dp"
android:drawableRight="@drawable/spinner_triangle"
android:fontFamily="sans-serif"
android:paddingLeft="16dp"
android:paddingRight="4dp"
android:textColor="#ffffffff"
android:textSize="18dp"
android:textStyle="bold"/>

</LinearLayout>

spinner_triangle 可绘制对象位于 here .

toolbar_spinner_item_dropdown.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="48dp"
android:drawablePadding="8dp"
android:gravity="center_vertical|start"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="#ff333333"
android:textSize="16sp"/>

</LinearLayout>

样式

toolbar_spinner.xml 使用以下样式。

<style name="Widget.MyApp.HeaderBar.Spinner" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar">
<item name="android:background">?android:selectableItemBackground</item>
<item name="android:dropDownSelector">?android:selectableItemBackground</item>
<item name="android:divider">@null</item>
<item name="android:overlapAnchor">true</item>
</style>

适配器

需要更改此适配器以满足您自己的需要。 getTitle() 返回微调器中显示的每个项目的文本。

private class YourObjectSpinnerAdapter extends BaseAdapter {
private List<YourObject> mItems = new ArrayList<>();

public void clear() {
mItems.clear();
}

public void addItem(YourObject yourObject) {
mItems.add(yourObject);
}

public void addItems(List<YourObject> yourObjectList) {
mItems.addAll(yourObjectList);
}

@Override
public int getCount() {
return mItems.size();
}

@Override
public Object getItem(int position) {
return mItems.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getDropDownView(int position, View view, ViewGroup parent) {
if (view == null || !view.getTag().toString().equals("DROPDOWN")) {
view = getLayoutInflater().inflate(R.layout.toolbar_spinner_item_dropdown, parent, false);
view.setTag("DROPDOWN");
}

TextView textView = (TextView) view.findViewById(android.R.id.text1);
textView.setText(getTitle(position));

return view;
}

@Override
public View getView(int position, View view, ViewGroup parent) {
if (view == null || !view.getTag().toString().equals("NON_DROPDOWN")) {
view = getLayoutInflater().inflate(R.layout.
toolbar_spinner_item_actionbar, parent, false);
view.setTag("NON_DROPDOWN");
}
TextView textView = (TextView) view.findViewById(android.R.id.text1);
textView.setText(getTitle(position));
return view;
}

private String getTitle(int position) {
return position >= 0 && position < mItems.size() ? mItems.get(position).title : "";
}
}

将微调器添加到您的工具栏

Toolbar toolbar = getActionBarToolbar();

View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.toolbar_spinner,
toolbar, false);
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
toolbar.addView(spinnerContainer, lp);

YourObjectSpinnerAdapter spinnerAdapter = new YourObjectSpinnerAdapter();
spinnerAdapter.addItems(getMyObjectSpinnerData());

Spinner spinner = (Spinner) spinnerContainer.findViewById(R.id.toolbar_spinner);
spinner.setAdapter(spinnerAdapter);

结果

Material Spinner

KitKat Spinner

关于android - 如何修复放置在工具栏顶部的 Android 4.x 微调器样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26755878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com