如何在窗口小部件的右侧创建没有向下三角形的android微调器

时间:2010-10-30 10:56:04

标签: android android-layout spinner nine-patch

我有一个屏幕,用户输入的项目很多,因此屏幕空间非常宝贵。

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

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

我无法看到这样的代码。

由于

8 个答案:

答案 0 :(得分:65)

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

最简单的方法

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"
    />       

在另一个答案中使用的syle只不过是在窗口小部件中应用背景。这可以直接完成到窗口小部件,从而节省了对新的xml文件的需求。当然,如果您打算将样式应用于微调器,那么这种方法没有任何问题。

为什么?

理解其工作原理的关键在于9补丁PNG的描述。右侧和底部的线用于填充,即,以防止其内容使用一些空间。在这种情况下,文本里面。标准的微调器背景使用右侧带有箭头的图像,该图像位于可用文本区域之外。有关说明,请参见下面的图1:

Figure 1. Original Spinner bacground 9-patch PNG http://i56.tinypic.com/3026kw4.png
图1.原始Spinner bacground 9-patch PNG。

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

Figure 2. Modified Spinner bacground 9-patch PNG with reduced padding http://i52.tinypic.com/2jfaxkw.png
图2.修改后的@android:drawable/btn_default bacground 9-patch PNG,填充量减少。

了解这一点,您可以为Spinner创建自己的背景(实际上,对于任何小部件)。

更好地解释9补丁文件can be found here

使用SDK(read about it here)中的 draw9patch 可执行文件创建文件非常简单,但没有什么可以阻止您使用 Photoshop Gimp 代替。请记住,9补丁PNG只是普通的PNG!唯一需要注意的是确保只绘制像素的外线,其余像素完全透明。 靠近边界的抗锯齿可能会产生意外结果。

答案 1 :(得分:40)

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

编辑: 你是对的,按照那篇文章它实际上非常简单:)你必须做两件事。 首先,在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,没有那个无用且恼人的向下箭头。

答案 2 :(得分:15)

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

android:background="#FFFFFFFF"

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

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

答案 3 :(得分:8)

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

android:background="@drawable/bg"

答案 4 :(得分:3)

我遇到了同样的问题,并将风格改为:

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

并且有效。

奇怪,它位于DropDownItem

具有底部三角形的那个被命名为正常。

干杯!

答案 5 :(得分: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行。

答案 6 :(得分: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();

答案 7 :(得分:0)

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

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

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

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