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

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

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

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

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

благодаря

Solutions Collecting From Web of "Как создать прядильщик Android без треугольника в правой части виджета"

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

EDIT: Вы правы, после этого сообщения это было действительно просто 🙂 Вы должны сделать две вещи. Сначала создайте файл 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, без этой немыслимой и раздражающей стрелки вниз.

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

Простейший метод

Ответ 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-файле. Конечно, если вы собираетесь применять стиль к прядильщику в любом случае, нет ничего плохого в этом подходе.

Зачем?

Ключом к пониманию того, как это работает, является описание PNG с 9 патчами . Строки справа и внизу используются для заполнения, т. Е. Для того, чтобы не использовать какое-либо пространство по его содержимому. В этом случае текст внутри. Стандартный фон Spinner использует изображение со стрелкой справа, которая находится за пределами полезной текстовой области. См. Рисунок 1 ниже для иллюстрации:

Рисунок 1. Исходный Spinner bacground 9-patch PNG http://i56.tinypic.com/3026kw4.png
Рисунок 1. Исходный Spinner bacground 9-patch PNG.

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

Рисунок 2. Модифицированный Spinner bacground 9-patch PNG с уменьшенным заполнением http://i52.tinypic.com/2jfaxkw.png
Рисунок 2. Модифицированный Spinner Spacular 9-patch PNG с уменьшенным заполнением.

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

Более подробное описание файлов с 9 патчами можно найти здесь.

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

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

 android:background="#FFFFFFFF" 

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

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

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

 android:background="@drawable/bg" 

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

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

  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 .

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

Ура!

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