如何在小部件右侧没有向下三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文件非常简单(请参阅此处 ),但是没有任何东西阻止您使用Photoshop或Gimp 。 请记住,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();