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

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

我可以更改一些 Spinner 样式属性来实现此目的吗?

我还没有看到这样的代码。

谢谢

有帮助吗?

解决方案

一两件事你可以做的是从Android的代码库取Spinner的源代码以及相关的布局和资源整合在一起,并用它们来创建自己的自定义窗口小部件(可能你只需要从布局中删除的箭头,然后捏捏代码根据需要一点点)。

编辑: 你说得对,下面这个职位它实际上是非常简单的:)你必须做两件事情。 首先,创建下RES /值的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 style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>

就是这样,现在的微调会看起来像一个普通的EditText,而没有无用的和恼人的向下箭头。

其他提示

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

最简单的方法

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 的描述. 。右侧和底部的线条用于填充,即保留一些空间不被其内容使用。在这种情况下,里面的文字。标准微调器背景使用右侧带有箭头的图像,该箭头位于可用文本区域之外。请参见下图 1 的说明:

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

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

Figure 2. Modified Spinner bacground 9-patch PNG with reduced padding
图 2.修改的 Spinner bacground 9-patch PNG,减少填充。

了解这一点将使您能够创建自己的背景 Spinner (事实上​​,对于任何小部件)。

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

使用以下命令创建文件非常容易 绘制9补丁 可从 SDK 执行(在这里阅读相关内容),但没有什么可以阻止您使用 Photoshop 或者 吉普 反而。请记住,9 片 PNG 只是普通 PNG!唯一需要注意的是确保您仅绘制像素的外部线,并且其余像素完全透明。 靠近边界的抗锯齿可能会产生意想不到的结果。

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

android:background="#FFFFFFFF"

此移除三角形指示器(旋转器背景图像和填充通过Aleadam说明)。

有关我的问题,我解决它添加一个父的LinearLayout只是背景设定为“白色”。

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

android:background="@drawable/bg"

我有同样的问题,改变了风格:

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

和它的工作。

如何奇数,它位于DropDownItem

虽然一个具有底部三角形被命名为正常。

干杯!

在当你实际点击微调采取空间相关的问题,我发现偶然的,你可以在正确的去除那些大的选择指标。你得到一个基本的清单相隔行,但您可以单击一个项目,它仍然有效。

设置像这样的旋转器,以获得选择的指标:

    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线。

你为什么不一起去列表的对话框。根据您的要求,创建一个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();

没有答案对我来说是有帮助的,所以这里是一个工作很简单的一个在线解决方案。

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

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

我不能肯定地告诉它是否将只是一个默认的微调布局工作,但它与我的自定义,我对其他需要创建工作良好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top