Spinner не переносит текст, это ошибка Android?

Если текст элемента Spinner слишком длинный и не помещается в одну строку, текст не переносится, а обрезается. Это только для уровня API >= 11. Вот скриншоты Android 4.2.2 (слева), на которых показано неправильное поведение, и Android 2.3.3 (справа), где все выглядит так, как ожидалось.

android:singleLine="false" здесь просто игнорируется. Так что, как и все другие попытки, такие как android:lines, android:minLines и т. д. TextView почему-то кажется намного шире, чем ширина окна.

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


Пожалуйста, обрати внимание:

Были некоторые ответы, предлагающие относительно простые решения.

  • Написание пользовательского Adapter и переопределение getView(), а также getDropDownView(). Это не решение здесь, потому что на данный момент все еще существует исходная проблема: как должен выглядеть макет для правильного переноса строк?

  • Оборачиваем TextView раскрывающегося списка в родительский ViewGroup. Не работает с android:layout_width="match_parent", потому что ширина родителя странно кажется неограниченной.

  • Предоставление выпадающему представлению фиксированной ширины. Это не подходит для разной ширины, которую может иметь Spinner.

  • И, конечно же, нет решения вручную вставлять \n в любом месте текста.


Воспроизвести с помощью следующего кода:

ОБНОВЛЕНИЕ: я также загрузил это как пример проекта на GitHub: Загрузить

/res/значения/массивы.xml:

<string-array name="items">
    <item>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.</item>
    <item>At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est.</item>
</string-array>

/res/layout/spinner_item.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="none"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:singleLine="false" />

Установить Adapter:

spinner.setAdapter(ArrayAdapter.createFromResource(this,
            R.array.items,
            R.layout.spinner_item));

person Matthias Robbers    schedule 03.01.2013    source источник
comment
Вам нужно создать собственный класс адаптера, который расширяет базовый адаптер, использовать метод getDropDownView() и установить для этого адаптера значение spinner, вот и все.   -  person Piyush    schedule 03.01.2013
comment
Глядя на исходный код Android, версия Spinner 2.3.3 (ссылка) отображает простой AlertDialog в виде раскрывающегося списка, тогда как версия 4.1.1 (ссылка) отображает собственное всплывающее окно. внутренний класс (подкласс ListPopupWindow). Исследование этой разницы, вероятно, является хорошей отправной точкой для любого, кто думает ответить на этот вопрос.   -  person XåpplI'-I0llwlg'I -    schedule 13.01.2013
comment
попробуйте использовать layout_weight=1, это может сработать   -  person Ajay    schedule 15.01.2013
comment
Почему бы вам не сообщить об этом андроиду и не посмотреть, что они скажут об этом?   -  person    schedule 15.01.2013
comment
Я думаю, что это имеет место только тогда, когда вы используете голографическую тему.   -  person lokoko    schedule 17.01.2013
comment
Вот отчет об ошибке на сайте b.android.com.   -  person Matthias Robbers    schedule 19.04.2013


Ответы (15)


В голографическом счетчике темы по умолчанию используется раскрывающийся режим. И все движения с переопределением стилей по умолчанию просто переходят в режим переключения режима счетчика в диалоговый режим, который успешно переносит многострочный текст, как в API 11. Вместо этого вы можете создать счетчик с помощью new Spinner(context, Spinner.MODE_DIALOG) или в xml: android:spinnerMode="dialog". Но это не решает проблему, потому что это диалог, а не выпадающий список.

Я нашел другое решение этой проблемы: переопределить метод getDropDownView в ArrayAdapter и поместить setSingleLine(false) в метод просмотра post. Поэтому, когда представление полностью создано, оно переносит текст в соответствующие строки.

@Override
public View getDropDownView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = new TextView(_context);
    }

    TextView item = (TextView) convertView;
    item.setText("asddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
    final TextView finalItem = item;
    item.post(new Runnable() {
        @Override
        public void run() {
            finalItem.setSingleLine(false);
        }
    });
    return item;
}

ОБНОВЛЕНИЕ:

А вот еще один ответ.

Вручную оберните список в PopupWindow и покажите его в TextView при щелчке и скройте его при щелчке listItem.

Простая реализация просто для демонстрации идеи:

public class MySpinner extends TextView {
    private PopupWindow _p;
    private ListView _lv;
    public MySpinner(Context context) {
        super(context);
        init();
    }
    public MySpinner(Context context, AttributeSet attributeSet){
        super(context, attributeSet);
        init();
    }

    private void init(){
        setBackgroundResource(R.drawable.spinner_background);
        final List<String> list = new ArrayList<String>();
        list.add("Very long text AAAAAAAAAAAAAAAA");
        list.add("1 Very long text AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        list.add("2 Very long text A");
        list.add("3 Very long text AAAAAAAAA");

        setMinimumWidth(100);
        setMaxWidth(200);

        _lv = new ListView(getContext());
        _lv.setAdapter(new ArrayAdapter<String>(getContext(), R.layout.simple_list_item_1, list));
        _lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                _p.dismiss();
                setText(list.get(i));
            }
        });

        setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {

                _p = new PopupWindow(getContext());
                _p.setContentView(_lv);
                _p.setWidth(getWidth());
                _p.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
                _p.setTouchable(true);
                _p.setFocusable(true);
                _p.setOutsideTouchable(true);
                _p.showAsDropDown(view);
            }
        });
    }
}
person Kolchuga    schedule 15.11.2013
comment
Хорошее решение! Ошибка до сих пор не исправлена ​​в Android 4.4, поэтому этот ответ очень полезен. - person Matthias Robbers; 17.11.2013
comment
Кажется, что вызов метода setSingleLine заставляет пересчитывать макет выпадающего списка счетчика после того, как TextViews отображается на экране. Я отклонил это решение, потому что при прокрутке элементов размер полосы прокрутки меняется динамически, а выпадающий элемент мигает, особенно на эмуляторе. Создать свой собственный счетчик с помощью PopupWindow и ListView довольно просто — см. мой следующий ответ. - person Kolchuga; 13.12.2013
comment
Вау, какой отстойный способ решить эту проблему. Но блин работает нормально :) - person Totumus Maximus; 12.02.2014
comment
Использование Spinner.Mode_DIALOG сработало для меня! Плюсом было то, что я уже динамически добавлял счетчик. Недостатком является то, что минимальный API должен быть равен 11. - person akvallejos; 25.11.2014
comment
Обходной путь: нет необходимости создавать finalItem. Просто объявите элемент как окончательный и установите его как setSingleLine(false), и он будет работать так, как ожидалось. Другой способ, вместо прямого программного создания TextView, создайте его из xml и оберните в LinearLayout или RelativeLayout. Это также решит проблему. - person Bhargav Jhaveri; 29.01.2015

У меня сработала только комбинация решений (проверено и на Android 5.1):

spinner_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="wrap_content">

  <TextView
    android:id="@android:id/text1"
    style="?android:attr/spinnerItemStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="false"
    android:textAlignment="inherit"/>
</LinearLayout>

код

  final ArrayAdapter<String> spinnerArrayAdapter=new ArrayAdapter<String>(activity,R.layout.spinner_item,android.R.id.text1,spinnerItemsList)
  {
  @Override
  public View getDropDownView(final int position,final View convertView,final ViewGroup parent)
    {
    final View v=super.getDropDownView(position,convertView,parent);
    v.post(new Runnable()
    {
    @Override
    public void run()
      {
      ((TextView)v.findViewById(android.R.id.text1)).setSingleLine(false);
      }
    });
    return v;
    }
  };
  spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
person android developer    schedule 23.04.2015
comment
спасибо, я использовал файл xml для элемента счетчика... и теперь он работает - person madhu527; 18.02.2016
comment
Обтекание TextView LinearLayout помогло мне добиться многострочного отображения текста! Спасибо! - person Max Diland; 25.02.2021

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

<Spinner
  ...
android:spinnerMode="dialog" />
person cVoronin    schedule 19.07.2013
comment
Это не решает проблему, это предотвращает проблему - person Vlado Pandžić; 12.07.2016

Добавление LinearLayout вокруг TextView позволяет правильно обтекать текст.

Макет (common_domainreferencemodel_spinner_item.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:padding="4dp">

       <TextView
            android:id="@+id/nameTextView"
            android:singleLine="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

</LinearLayout>

Адаптер:

public class DomainReferenceModelAdapter extends ArrayAdapter<DomainReferenceModel> {

    private List<DomainReferenceModel> objects;
    private LayoutInflater inflater;
    private int oddRowColor = Color.parseColor("#E7E3D1");
    private int evenRowColor = Color.parseColor("#F8F6E9");

    public DomainReferenceModelAdapter(Context context, int resource, List<DomainReferenceModel> objects) {
        super(context, resource, objects);
        this.objects = objects;
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    static class ViewHolder {
        public TextView nameTextView;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewInternal(position, convertView, parent, false);
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return getViewInternal(position, convertView, parent, true);
    }

    private View getViewInternal(int position, View convertView, ViewGroup parent, boolean isDropdownView) {
        View view = convertView;
        if (view == null) {
            view = inflater.inflate(R.layout.common_domainreferencemodel_spinner_item, null);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.nameTextView = (TextView) view.findViewById(R.id.nameTextView);
            view.setTag(viewHolder);
        }
        if (isDropdownView) {
            view.setBackgroundColor(position % 2 == 0 ? evenRowColor : oddRowColor);
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        DomainReferenceModel model = objects.get(position);
        holder.nameTextView.setText(model.getName());
        return view;
    }

}
person Mike Schall    schedule 02.01.2014

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

Обходной путь:

  • создайте стиль для Spinner, который не наследуется от Holo. Это активирует многострочные выпадающие элементы.
  • Настройте Spinner «вручную», чтобы он выглядел как Holo.

Это производит (показывая закрытые и открытые состояния):

введите здесь описание изображения

Детали реализации:

Насколько я могу судить, невозможно наследовать тему Holo на Spinner и отображать несколько строк в раскрывающемся элементе Spinner, даже если мы установим для атрибута TextView singleLine раскрывающегося элемента значение false и предоставим пользовательский макет. . Я также пытался сохранить стиль Holo, но изменил

android:spinnerStyle
android:spinnerItemStyle 
android:spinnerDropDownItemStyle 

атрибуты стилей (пример использования этих атрибутов здесь), но я не мог заставить его производить многострочный результат.

Однако, если мы переопределим стиль для Spinner и не наследуем spinnerStyle от Holo:

 <style name="AppTheme" parent="android:Theme.Holo.Light">
    <item name="android:spinnerStyle">@style/spinnerStyle</item>
</style>

<--no parent attribute-->
 <style name="spinnerStyle">
    <item name="android:clickable">true</item>
</style>

тогда раскрывающийся элемент будет поддерживать отображение нескольких строк. Но теперь мы потеряли тему Holo на Spinner, и закрытое состояние выглядит как TextView, а не Spinner, без стрелки или визуальной подсказки, что это Spinner. Если мы вместо этого установим spinnerStyle parent равным: parent="android:style/Widget.Spinner:

<style name="spinnerStyle" parent="android:style/Widget.Spinner">
    <item name="android:clickable">true</item>
</style>

в закрытом состоянии Spinner будет показана стрелка, но он будет оформлен как серый Spinner до Holo, который выглядит неуместным в приложении Holo.

Итак, возможное решение:

  • Переопределите тему для spinnerStyle и не используйте Holo в качестве родителя. Это позволит использовать многострочный текст в элементах раскрывающегося списка.
  • Измените фон Spinner так, чтобы он наследовал тему Holo.

Вот пример:

Создайте базовое действие:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Spinner spinner = (Spinner)findViewById(R.id.styled_spinner);

    spinner.setAdapter(ArrayAdapter.createFromResource(this,
            R.array.items,
            R.layout.spinner_item));        
}

Схема деятельности:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="50dip"
    tools:context=".MainActivity" >

    <Spinner
        android:id="@+id/styled_spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

стили:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="AppTheme" parent="android:Theme.Holo.Light">
        <item name="android:spinnerStyle">@style/spinnerStyle</item>
    </style>
    <style name="spinnerStyle">
        <item name="android:clickable">true</item>
        <item name="android:background">@drawable/spinner_background_holo_light</item>
    </style>
</resources>

в папке с возможностью рисования поместите spinner_background_holo_light:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false"
        android:drawable="@drawable/spinner_disabled_holo_light" />
    <item android:state_pressed="true"
        android:drawable="@drawable/spinner_pressed_holo_light" />
    <item android:state_pressed="false" android:state_focused="true"
        android:drawable="@drawable/spinner_focused_holo_light" />
    <item android:drawable="@drawable/spinner_default_holo_light" />
</selector>

и включите эти чертежи в папку drawables-hdpi:

введите здесь описание изображенияspinner_default_holo_light.9.png

введите здесь описание изображенияspinner_disabled_holo_light.9.png

введите здесь описание изображенияspinner_focused_holo_light.9.png

введите здесь описание изображенияspinner_pressed_holo_light.9.png

Это создает счетчик с закрытым состоянием на тему Holo и многострочными элементами, как показано на снимках экрана выше.

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

В этом примере android:minSdkVersion было установлено на 14, а android:targetSdkVersion на 17 в манифесте.

Графика Holo и код spinner_background_holo_light.xml взяты из HoloEverywhere Copyright (c) 2012 Кристоф Версье, Сергей Шатунов. Подробную информацию о лицензии см. в связанном с проектом github.

person onosendai    schedule 18.01.2013
comment
это было в основном полезно, что именно находится в spinner_item.xml? использовать style="@style/spinnerStyle" в моем проверенном тексте spinner_item.xml? Нужно спросить, потому что, когда я нажимаю на элемент, ничего не происходит, он выделяется, но нет списка элементов, которые появляются. - person CQM; 09.03.2013
comment
@CQM Это TextView с шириной, установленной на fill_parent, и высотой, установленной на wrap_content. - person onosendai; 09.03.2013
comment
спасибо, где это установлено на объект? style="@style/spinnerStyle" - person CQM; 09.03.2013
comment
Он применяется как стиль к счетчикам путем включения ‹item name=android:spinnerStyle›@style/spinnerStyle‹/item› в тему приложения («AppTheme» в приведенном выше примере). - person onosendai; 09.03.2013

Я столкнулся с той же проблемой. Я хочу видеть 2 строки в выпадающем списке счетчика, но все решения, которые я нашел, кажутся мне неразумными для решения такой простой проблемы. Я исследую Исходный код Spinner и я нашел Если мы используем пользовательский .xml с атрибутом android:singleLine="false"

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/multiline_spinner_text_view"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:singleLine="false" />

и по умолчанию ArrayAdapter, следующий код, выполненный в ListPopupWindow каждый раз

    @Override
       View More obtainView(int position, boolean[] isScrap) {
            View view = super.obtainView(position, isScrap);

           if (view instanceof TextView) {
                ((TextView) view).setHorizontallyScrolling(true);
            }

            return view;        
}

и именно поэтому мы видим только одну строковую строку в строке списка, она фактически прокручивается.

Чтобы решить эту проблему, наше представление должно быть не экземпляром TextView, просто поместите TextView внутрь FrameLayout или LinearLayout.

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <CheckedTextView
            android:id="@+id/multiline_spinner_text_view"
            android:layout_width="fill_parent"
            android:layout_height="?android:attr/listPreferredItemHeight"
            android:singleLine="false" />

    </LinearLayout>

а также

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
               R.layout.multiline_spinner_dropdown_item,R.id.multiline_spinner_text_view,
                awasomeListValues);

Это решение работает в обоих режимах счетчика: MODE_DROPDOWN и MODE_DROPDOWN. Надеюсь, оно вам поможет!

person girlOnSledge    schedule 27.02.2014

Я думаю, что это ошибка на Android. Вы можете попробовать это. Удалите пробелы из текста, а затем отобразите, что все будет работать нормально. Если длина текстового представления ‹ длины строки, она игнорирует все символы после пробела. Для обхода вы можете попробовать это:

добавьте файл в папку res/layout с именем multiline_spinner_dropdown_item.xml с примером кода:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/spinnerDropDownItemStyle"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:ellipsize="marquee" />

и когда вы создаете счетчик, создайте его из этого макета.

Что-то типа :

ArrayAdapter.createFromResource(this, items, R.layout.multiline_spinner_dropdown_item);

По сути, скопируйте макет android.R.layout.simple_spinner_dropdown_item в проект и измените макет, установив для атрибута singleLine значение false в CheckedTextView.

person lokoko    schedule 01.02.2013
comment
отлично работает API 27 - person Simão Garcia; 07.11.2018

Чтение этого ответа: кастинг textview ошибка: - android.widget.LinearLayout не может быть приведен к android.widget.TextView, и в этой теме я мог бы решить эту проблему: нам нужен LinearLayout, обертывающий TextView (текст счетчика), чтобы избежать выхода текста из экран, но нам придется решить некоторые проблемы. Для начала создайте макет (я назвал его spinner_dd_item.xml):

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/simple_spinner_dropdown"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="5dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="5dp"
            android:textColor="@color/colorAccent"
            tools:text="Hello" />
    </LinearLayout>

Следующим шагом является создание экземпляра ArrayAdapter для установки счетчика:

    ArrayAdapter<CharSequence> arrayAdapter = new ArrayAdapter<CharSequence>(getActivity(), R.layout.spinner_dd_item,
            R.id.simple_spinner_dropdown, hashmapToString(hashMap, keys)) {
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            return getView(position, convertView, parent);
        }
    };
    spinner.setAdapter(arrayAdapter);

Не забудьте добавить имя макета и идентификатор TextView в ArrayAdapter, потому что мы добавили LinearLayout и нам нужно указать TextView и переопределить getDropDownView, чтобы получить представление, которое отображает данные в указанной позиции в наборе данных. Теперь мы можем видеть, что счетчик хорошо работает на новых и старых версиях Android.

person Jaco    schedule 28.03.2017

Вот что я сделал, чтобы заставить его работать:

ArrayAdapter<KeyValue> adapter = new ArrayAdapter<>(getContext(), R.layout.simple_dropdown_item_multiline, R.id.nameTextView, choices);

А это содержимое «simple_dropdown_item_multiline»:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

<TextView android:id="@+id/nameTextView"
          style="?android:attr/dropDownItemStyle"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:ellipsize="marquee"
          android:paddingBottom="@dimen/large"
          android:paddingTop="@dimen/large"
          android:singleLine="false"
          android:textAppearance="?android:attr/textAppearanceLargePopupMenu"/>

person Marco C.    schedule 27.06.2017

Я только что обнаружил, что у Android есть стиль для этого случая.

final Spinner pelanggaran = (Spinner) findViewById(R.id.pelanggaran);
ArrayAdapter<CharSequence> pelanggaran_adapter = ArrayAdapter.createFromResource(this,R.array.pelanggaran_array, android.R.layout.simple_expandable_list_item_1);
pelanggaran_adapter.setDropDownViewResource(android.R.layout.simple_expandable_list_item_1);
pelanggaran.setAdapter(pelanggaran_adapter);

надеюсь, это решило вашу проблему.

person Fajar Rukmo    schedule 16.08.2017

У меня была такая же проблема, и я нашел решение.

Я хотел, чтобы текст переносился на начальный экран, а также в раскрывающийся список.

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

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

Как оказалось, у адаптеров есть метод setDropDownViewResource(), который позволяет вам установить представление для раскрывающегося списка, отличное от того, которое отображается при первоначальном выборе счетчика.

 import org.holoeverywhere.widget.Spinner;

 ArrayAdapter adapter1 = ArrayAdapter.createFromResource(this,R.array.array_of_strings,R.layout.simple_list_item_1);
 adapter1.setDropDownViewResource(R.layout.my_simple_list_item_1);
 spQ1.setAdapter(adapter1);

в этом примере simple_list_item — это представление по умолчанию, предоставляемое Android, а my_simple_list_item —

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="300dp"
android:layout_height="wrap_content" >   

<TextView
  android:id="@+id/android:text1"
  android:layout_width="wrap_content"
  android:layout_height="50dp"
  android:ellipsize="marquee"
  android:layout_gravity="center_vertical"
  android:singleLine="false"/>

</LinearLayout> 

Теперь текст переносится внутри раскрывающегося списка счетчика И в отображаемом выборе счетчиков.

person Michael Alan Huff    schedule 12.04.2013
comment
Это всего лишь обходной путь, а не решение. Вы устанавливаете ширину на 300dp. Конечно, это приводит к переносу текста. Решение по-прежнему будет использовать match_parent. Спасибо, что поделились этим в любом случае! - person Matthias Robbers; 18.04.2013
comment
Когда я оборачиваю свои элементы списка TextView в LinearLayout, это просто приводит к сбою моего приложения. - person Jeff; 20.06.2013

Просто оберните TextView LinearLayout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
    <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</LinearLayout>
person mixel    schedule 16.04.2015

Я решил эту проблему, добавив \n (новая строка) в текст (так просто).

<string name="bmr1">sedentary (little or no exercise)</string>
<string name="bmr2">lightly active (light exercise/\nsports 1-3 days/week)</string>
<string name="bmr3">moderately active (moderate exercise/\nsports 3-5 days/week)</string>
<string name="bmr4">very active (hard exercise/\nsports 6-7 days a week)</string>
<string name="bmr5">extra active (very hard exercise/sports &amp;\nphysical job or 2x training)</string>

Выглядит так:

введите здесь описание изображения

И это макет, который счетчик использует как строку:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/default_listview_row"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="false"
    android:gravity="center_vertical"
    android:textColor="@android:color/white"
    android:background="@android:color/transparent"
    android:padding="5dp" />
person Goran Horia Mihail    schedule 25.08.2016

    Spinner sp_type = dialogView.findViewById(R.id.sp_type);
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getFragment().getContext(), android.R.layout.simple_spinner_dropdown_item, getFragment().getResources().getStringArray(R.array.courier_delivery_types_array));
dataAdapter.setDropDownViewResource(android.R.layout.simple_list_item_1);

simple_list_item_1 будет отображать выпадающее текстовое представление счетчика с несколькими строками. Но выбранный счетчиком текст отображается в одну строку. Мы можем заменить 2-ю строку на simple_list_item_1 вместо simple_spinner_dropdown_item (для нескольких строк)

person malli    schedule 13.08.2020

person    schedule
comment
Да, простое решение, такое как android.R.layout.select_dialog_item, было моим лучшим решением. - person Dezo; 04.12.2020