如何在小部件右侧创建没有下三角形的Android微调器
-
27-09-2019 - |
题
我有一个屏幕,用户有很多项目需要输入,因此屏幕空间非常宝贵。
我希望屏幕上小部件的外观(在用户按下它之前)与 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
).
图 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);
我不能肯定地告诉它是否将只是一个默认的微调布局工作,但它与我的自定义,我对其他需要创建工作良好。