如何在小部件右侧没有向下三angular形的情况下创buildandroid微调器

我有一个屏幕,用户有很多项目input,所以屏幕空间是非常宝贵的。

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

有一些微调样式属性,我可以改变来完成这个?

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

谢谢

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

编辑:你是对的,继这个post后,其实很简单:)你必须做两件事。 首先,在res / values下创build一个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,没有那个无用的和恼人的向下箭头。

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

最简单的方法

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

图1.原始的微调器免费9贴片PNG 160wpb4.png
图1.原始的Spinner 9-修补程序PNG。

只是删除箭头是不够的,因为填充保持在那里。 你需要使用一个减less了填充的新的9-patch图像(参见图2中的一个基于图1的例子),或者使用一个没有太多填充的预编译的9-patch图像,比如EditText@android:drawable/edit_text )或Button@android:drawable/btn_default )。

图2.修改的微调器免提9-patch PNG减less了填充160wpb4.png
图2.修改的Spinner 9贴片PNG减less填充。

理解这个可以让你为Spinner创build自己的背景(事实上,对于任何widget)。

9-patch文件的更好的解释可以在这里find

使用SDK中的draw9patch可执行文件创build文件非常简单(请参阅此处 ),但是没有任何东西阻止您使用PhotoshopGimp 。 请记住,9修补程序PNG只是普通的PNG! 唯一需要注意的是确保只绘制像素的外部线条,其余像素完全透明。 靠近边界的抗锯齿可能会产生意想不到的结果。

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

 android:background="#FFFFFFFF" 

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

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

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

 android:background="@drawable/bg" 

在您实际点击微调时所遇到的相关空间问题上,我意外地发现,您可以在右边删除那些大的select指标。 你得到一个基本的列表分行,但你可以点击一个项目,它仍然工作。

设置一个这样的微调来获得select指标:

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

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

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

它的工作。

有多奇怪,它位于DropDownItem

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

干杯!

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