42

我有一个屏幕,用户可以在其中输入许多项目,因此屏幕空间非常宝贵。

我希望屏幕上小部件的外观(在用户按下它之前)类似于 Spinner 右侧的 EditText 或 Spinner 小部件的左侧部分(没有正常的向下三角形)。然后当用户按下小部件时,他/她将获得正常的 Spinner 选择对话框。

我可以更改一些 Spinner 样式属性来完成此操作吗?

我一直无法看到这样的代码。

谢谢

4

8 回答 8

67

这是一个很老的问题,但我认为仍然相关,所以这是我的答案:

最简单的方法

lencinhaus 的答案是正确的。它可以工作,但可以以更简单的方式完成:只需为其添加另一个背景。下面的示例使用标准Button背景以获得更均匀的外观:

<Spinner
    android:id="@+id/my_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:prompt="@string/my_prompt" 
    android:background="@android:drawable/btn_default"
    />       

另一个答案中使用的样式只不过是为小部件应用背景。这可以直接在小部件上完成,无需新的 xml 文件。当然,如果您无论如何都要将样式应用于微调器,那么这种方法没有任何问题。

为什么?

理解其工作原理的关键在于对 9-patch PNG 的描述。右边和底部的线用于填充,即保持一些空间不被其内容占用。在这种情况下,里面的文字。标准 Spinner 背景使用右侧带有箭头的图像,该箭头位于可用文本区域之外。请参见下图 1 中的说明:

图 1. 原始 Spinner 免费 9 补丁 PNG http://tinypic.com/images/404.gif
图 1. 原始Spinner免费 9 补丁 PNG。

仅删除箭头是不够的,因为填充仍然存在。您需要使用具有减少填充的新 9 补丁图像(参见图 2 中基于图 1 的示例)或使用没有太多填充的预编译 9 补丁图像之一,例如EditText( @android:drawable/edit_text) 或Button( @android:drawable/btn_default)。

图 2. 改进的 Spinner bacground 9-patch PNG 减少了填充
图 2. 修改后Spinner的免费 9-patch PNG,减少了填充。

Spinner了解这一点将允许您为(实际上,为任何小部件)创建自己的背景。

可以在此处找到对 9 个补丁文件的更好解释

使用 SDK 中的draw9patch可执行文件创建文件非常容易(请在此处阅读),但没有什么能阻止您改用PhotoshopGimp。请记住,9-patch PNG 只是普通的 PNG!唯一需要注意的是确保您只绘制像素的外线,并且其余像素是完全透明的。靠近边界的抗锯齿可能会产生意想不到的结果。

于 2011-05-08T14:33:01.873 回答
40

您可以做的一件事是Spinner从 android 代码库中获取源代码,以及相关的布局和资源,并使用它们来创建您自己的自定义小部件(可能您只需要从布局中删除箭头并调整代码很少取决于您的需要)。

编辑:你是对的,在那篇文章之后它实际上非常简单:) 你必须做两件事。首先,在 res/values 下创建一个 styles.xml 文件,打开它并添加以下内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style parent="@android:style/Widget.Spinner" name="SpinnerAsEditText">
        <item name="android:background">@android:drawable/edit_text</item>
    </style>
</resources>

接下来,在您的布局中,像这样添加 Spinner:

<Spinner style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>

就是这样,现在微调器看起来像一个普通的 EditText,没有那个无用且烦人的向下箭头。

于 2010-10-30T16:23:40.363 回答
15

我刚到这个问题,因为我的微调器没有显示三角形指示器,现在我明白了为什么:我将背景设置为“白色”:

android:background="#FFFFFFFF"

这将删除三角形指示器(由 Aleadam 声明的微调器背景图像和填充)。

对于我的问题,我解决了它添加一个父 LinearLayout 只是为了将背景设置为“白色”。

于 2013-08-22T06:46:48.237 回答
7

给它一个背景,箭头会消失。

android:background="@drawable/bg"
于 2016-02-17T21:20:29.097 回答
3

我遇到了同样的问题并将样式更改为:

style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"

它奏效了。

多么奇怪,它位于DropDownItem

而具有底部三角形的那个被命名为法线。

干杯!

于 2014-06-12T17:43:07.593 回答
2

关于实际单击微调器时占用空间的相关问题,我偶然发现您可以删除右侧的那些大选择指示器。您会得到一个由行分隔的基本列表,但您可以单击一个项目,它仍然有效。

像这样设置一个微调器来获取选择指标:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.petals, android.R.layout.simple_spinner_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter1);

对于没有指标,只需省略 setDropDownViewResource 行。

于 2011-11-01T14:32:08.547 回答
1

你为什么不去与列表对话。根据您的要求,创建一个 edittext 字段,添加 setOnFocusChangeListener,然后在 onFocusChange() 方法中显示一个包含列表项的对话框。对于带有列表项的对话框

new AlertDialog.Builder(this)
                .setTitle("<Title>")
                .setItems(R.array.<ItemsArrayName>, new DialogInterface.OnClickListener(){
     @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub  
}}).show();
于 2011-02-02T03:44:30.247 回答
-1

没有答案对我有帮助,所以这是一个非常简单的单行解决方案。

  //some spinner initialisation stuff->
mySpinner.setAdapter(adapter);

  //some spinner initialisation stuff->
mySpinner.getBackground().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

我无法确定它是否仅适用于默认微调器布局,但它适用于我为其他需求创建的自定义。

于 2018-01-05T22:16:25.030 回答