Как создать Android Spinner без треугольника вниз на правой стороне виджета - PullRequest
41 голосов
/ 30 октября 2010

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

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

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

Я не смог увидеть код, подобный этому.

Спасибо

Ответы [ 8 ]

65 голосов
/ 08 мая 2011

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

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

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

Почему?

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

Рисунок 1. Оригинальный Spinner Bacground 9-патч PNG http://i56.tinypic.com/3026kw4.png
Рисунок 1. Оригинальный Spinner задний 9-патч PNG.

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

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

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

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

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

40 голосов
/ 30 октября 2010

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

15 голосов
/ 22 августа 2013

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

android:background="#FFFFFFFF"

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

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

8 голосов
/ 18 февраля 2016

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

android:background="@drawable/bg"
3 голосов
/ 12 июня 2014

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

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

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

Как странно, он расположен в DropDownItem.

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

Ура!

2 голосов
/ 01 ноября 2011

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

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

    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.

1 голос
/ 02 февраля 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();
0 голосов
/ 06 января 2018

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

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

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

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

...