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

StackOverflow https://stackoverflow.com/questions/4058360

Вопрос

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

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

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

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

Спасибо

Это было полезно?

Решение

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

Редактировать: Вы правы, следуя по этому посту, это было действительно действительно просто :) Вы должны делать две вещи. Во-первых, создайте файл styles.xml под res / value, откройте его и добавьте следующее:

<?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"
    />       

Syle, используемый в другом ответе, не более чем нанесение на виджет фона. Это можно сделать непосредственно к виджету, сохраняя необходимость в новом файле XML. Конечно, если вы собираетесь применить стиль спиннера в любом случае, в этом подходе нет ничего плохого.

Почему?

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

Рисунок 1. Оригинал Spinner Bacground 9-Patch Png http://tinypic.com/images/404.gif
Рисунок 1. Оригинал Spinner Bacground 9-Patch Png.

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

Figure 2. Modified Spinner bacground 9-patch PNG with reduced padding
Рисунок 2. Изменяется Spinner Bacground 9-Patch Png с уменьшенной прокладкой.

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

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

Очень легко создавать файлы с Draw9Patch. исполняемый от SDK (Читайте об этом здесь), но ничто не мешает вам использовать Фотошоп или Ума вместо. Помните, что 9-патч PNG просто просто Pngs! Единственное предостережение - убедиться, что вы рисуете только на внешние линии пикселей, и остальные пиксели полностью прозрачны. Антирий, близкий к границе, может дать неожиданные результаты.

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

android:background="#FFFFFFFF"

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

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

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

android:background="@drawable/bg"

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

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

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

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

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

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

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

Настройте 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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top