Как создать андроид-спиннер без треугольника вниз в правой части виджета

У меня есть экран, на котором у пользователя есть много элементов для ввода, поэтому пространство на экране в большом почете.

Я хочу, чтобы вид виджета на экране (до того, как пользователь нажмет его) был похож на EditText или левую часть виджета Spinner (без нормального треугольника вниз) с правой стороны Spinner. Затем, когда пользователь нажимает на виджет, он/она получает обычный диалог выбора Spinner.

Есть ли какой-то атрибут стиля Spinner, который я могу изменить, чтобы выполнить это?

Я не смог увидеть такой код.

Спасибо


person Mike    schedule 30.10.2010    source источник


Ответы (8)


Одна вещь, которую вы можете сделать, это взять исходный код Spinner из базы кода Android вместе с соответствующими макетами и ресурсами и использовать их для создания собственного пользовательского виджета (вероятно, вам нужно будет только удалить стрелку из макета и немного изменить код в зависимости от ваших потребностей).

РЕДАКТИРОВАТЬ: Вы правы, после этого поста это было на самом деле очень просто :) Вы должны сделать две вещи. Сначала создайте файл styles.xml в папке res/values, откройте его и добавьте следующее:

<?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, без этой бесполезной и надоедливой стрелки вниз.

person lencinhaus    schedule 30.10.2010
comment
Я надеялся на более легкий путь. Я нашел это сообщение (groups.google.com/ group/android-developers/browse_thread/thread/), но я все еще пытаюсь полностью понять его. У меня создалось впечатление, что они заявляют, что все, что нужно, это создать стиль, который устраняет стрелку вниз, а затем применить этот стиль. Придется поэкспериментировать. - person Mike; 02.11.2010
comment
Мой счетчик находится в меню, это пункт - person IntoTheDeep; 13.04.2016
comment
Если вы предпочитаете решение во время выполнения: categorySpinner.background = ContextCompat.getDrawable(this, R.drawable.abc_edit_text_material) - person Desmond Lua; 04.03.2018

Это довольно старый вопрос, но я думаю, что он все еще актуален, поэтому вот мой ответ:

Самый простой метод

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-исправлений PNG. Строки справа и внизу используются для заполнения, т. е. для того, чтобы некоторое пространство не использовалось его содержимым. В данном случае текст внутри. Стандартный фон Spinner использует изображение со стрелкой справа, которое находится за пределами используемой текстовой области. См. иллюстрацию на рис. 1 ниже:

http://tinypic.com/images/404.gif
Рис. 1. Исходный Spinner фоновый 9-патч PNG.

Просто удалить стрелку недостаточно, так как отступ остается. Вам нужно использовать новое изображение с 9 патчами с уменьшенным отступом (см. рис. 2 для примера, основанного на рис. 1) или использовать одно из предварительно скомпилированных изображений с 9 патчами без такого большого отступа, например, для EditText (< strong>@android:drawable/edit_text) или Button (@android:drawable/btn_default).

Рисунок 2. Модифицированный фоновый 9-элементный PNG Spinner с уменьшенным отступом
Рисунок 2. Модифицированный Spinner фоновый 9-элементный PNG с уменьшенным отступом.

Понимание этого позволит вам создавать свои собственные фоны для Spinner (и, собственно, для любого виджета).

Лучшее объяснение файлов с 9 исправлениями можно найти здесь

Создать файлы с исполняемым файлом draw9patch из SDK очень просто (прочитайте об этом здесь), но ничто не мешает вам использовать Photoshop или Gimp< /strong> вместо этого. Помните, PNG с 9 патчами — это просто PNG! Единственное предостережение — убедитесь, что вы рисуете только внешние линии пикселей, а остальные пиксели полностью прозрачны. Сглаживание вблизи границы может привести к неожиданным результатам.

person Aleadam    schedule 08.05.2011
comment
если бы я мог дать вам больше очков, чем один, я бы, спасибо за вашу помощь! - person Lena Bru; 03.06.2013
comment
Я хочу проголосовать за этот ответ несколько раз. Большое спасибо за самое простое решение! - person Zeba; 16.06.2014
comment
К вашему сведению, изображение на Рисунке 1 теперь сломано. - person donfuxx; 14.10.2015

Я только что пришел к этому вопросу, потому что мой счетчик не показывал индикатор треугольника, теперь я понимаю, почему: я устанавливал фон на «белый»:

android:background="#FFFFFFFF"

Это удаляет индикатор треугольника (фоновое изображение счетчика и отступы, указанные Aleadam).

Для моей проблемы я решаю ее, добавляя родительский LinearLayout только для того, чтобы сделать фон «белым».

person pvalle    schedule 22.08.2013

Дайте ему фон, стрелка исчезнет.

android:background="@drawable/bg"
person Kai Wang    schedule 17.02.2016
comment
какой ответ - так ez - person med116; 16.01.2017
comment
не работает и копирование приведенных выше ответов вообще не интересно - person user347187; 21.05.2020

У меня была такая же проблема, и я изменил стиль на:

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

и это сработало.

Как странно, он находится в DropDownItem.

В то время как тот, у которого есть нижний треугольник, называется нормальным.

Ваше здоровье!

person Abdullah Umer    schedule 12.06.2014
comment
Решил мою проблему. Спасибо! :) - person Marcello Galhardo; 02.02.2016
comment
Мне не помогло <Spinner android:id="@+id/planets_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"/> - person ashishdhiman2007; 08.08.2016

Что касается связанного с этим вопроса о пространстве, занимаемом, когда вы на самом деле нажимаете на счетчик, я случайно обнаружил, что вы можете удалить эти большие индикаторы выбора справа. Вы получаете базовый список, разделенный строками, но вы можете щелкнуть элемент, и он все равно будет работать.

Настройте счетчик таким образом, чтобы получить индикаторы выбора:

    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.

person Alan Finners    schedule 01.11.2011

почему бы вам не перейти к диалогу со списком. В соответствии с вашим требованием создайте поле 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();
person Venugopal    schedule 02.02.2011

Ни один ответ не помог мне, поэтому вот действительно простое однострочное решение, которое сработало.

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

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

Я не могу точно сказать, будет ли он работать только с макетом счетчика по умолчанию, но он хорошо работал с моим пользовательским, который я создал для других нужд.

person Nor Newman    schedule 05.01.2018