Настройка расстояния между прядильщиками

Spinners обеспечивают два состояния. Первое и состояние по умолчанию ( состояние A ) показывает текущее выбранное значение. Второй ( состояние B ) показывает выпадающее меню, когда косвенный дисплей коснется.

Пример состояния A и B

По умолчанию добавляется левое дополнение к элементам, отображаемым в состояниях A и B. Я хотел бы удалить его, когда отображается текущее выбранное значение ( состояние A ), но сохранить его, когда элементы отображаются в выпадающем меню ( состояние B ) ,

Поскольку заполнение задано с помощью CheckedTextView, используемого в макете, который указан при создании счетчика, моя первая попытка заключалась в том, чтобы передать конструктору spinner настраиваемый макет, содержащий CheckedTextView с пустым заполнением. Таким образом, левое заполнение исчезает в состоянии A, но также в состоянии B. Однако моя цель состояла в том, чтобы сохранить его для состояния A.

Моя вторая попытка заключалась в настройке android: dropDownSpinnerStyle в определении моей темы. Из-за изменения цвета фона для android: dropDownSpinnerStyle меняет цвет фона элемента только в состоянии А, я думал переопределить marginLeft или paddingLeft с отрицательным значением. К сожалению, это не имеет никакого эффекта.

Учитывая, что отрицательная маржа / заполнение, по-видимому, не учитывается, я пробовал обратное. Во-первых, я использовал настраиваемый макет элемента (как объяснялось для моей первой попытки), чтобы удалить левое дополнение в обоих состояниях (A и B). Во-вторых, я определил собственный стиль для свойства android: dropDownListViewStyle . К сожалению, использование положительного значения marginLeft с последним свойством не влияет. Таким образом, я установил paddingLeft. Он работает и позволяет мне получить левый интервал только для состояния В. Однако левое пространство применяется также к цвету заднего фона (см. Изображение ниже).

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

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

Ниже приведено мое определение темы для третьей попытки:

<style name="Theme.App.Base" parent="Theme.App"> ... <item name="android:dropDownListViewStyle">@style/Widget.Spinner.DropDown.ListView</item> </style> <style name="Widget.Spinner.DropDown.ListView" parent="Widget.AppCompat.ListView.DropDown"> <item name="android:paddingLeft">16dp</item> </style> 

Solutions Collecting From Web of "Настройка расстояния между прядильщиками"

State A принимает следующий стиль:

 // Theme (Base) // Theme.AppCompat @android:style/Widget.TextView.SpinnerItem // Holo & Holo Light @android:style/Widget.Holo.TextView.SpinnerItem 

Атрибутом при игре здесь является spinnerItemStyle .

Кроме того, paddingLeft не paddingLeft , а paddingStart – для поддержки языков LTR и RTL. Аналогично, paddingEnd устанавливается вместо paddingRight . Эта информация относится к API> = 17.

Если вы используете AppCompat, вы по-прежнему переопределяете атрибут spinnerItemStyle , но предоставляете paddingLeft и paddingRight .

Пример:

 <style name="Theme.App.Base" parent="Theme.App"> ... <item name="android:spinnerItemStyle">@style/TextViewSpinnerItem</item> </style> <style name="TextViewSpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem"> <item name="android:paddingLeft">40dp</item> <item name="android:paddingRight">40dp</item> </style> 

Значение 40dp предназначено для тестирования, если настройка этого стиля даже работает. Это должно состоять только в состоянии State A (с 40dp), оставив State B с заполнением по умолчанию 8dp . После подтверждения вы можете сделать это 0dp или согласно вашему требованию.

В результате я получаю:

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

Обновить:

В отношении образца проекта – MainActivity :

 spinner.setAdapter(ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item)); 

Предоставляя адаптер android.R.layout.simple_spinner_item , вы говорите ему использовать макет для состояния A и состояния B. Это проблема из-за способа определения этого макета:

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" style="?android:attr/spinnerItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:textAlignment="inherit"/> 

Обратите внимание на style применяемый к этому TextView . Раньше я предлагал переопределить этот атрибут. И это сработало. Но так как этот макет используется для обоих состояний, результат не так желателен.

На самом деле утверждение выше (хотя и не делает ничего в данный момент) более перспективно:

 ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item) .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

Используя setDropDownViewResource(int) , вы позволяете вводить различные атрибуты стиля. В этом случае состояние A будет представлено android.R.layout.simple_spinner_item а State B будет использовать android.R.layout.simple_spinner_dropdown_item .

Давайте посмотрим на android.R.layout.simple_spinner_dropdown_item :

 <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" style="?android:attr/spinnerDropDownItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="?android:attr/dropdownListPreferredItemHeight" android:ellipsize="marquee"/> 

Теперь мы можем переопределить другой атрибут – spinnerDropDownItemStyle – и дать State B совершенно другой взгляд. Но мы этого не сделаем. На Lollipop spinnerDropDownItemStyle указывает на стиль Widget.Material.DropDownItem.Spinner который устанавливает paddingX в 8dp . И вы сказали, что вы в порядке с заполнением по умолчанию в State B.

Итак, вот что вам нужно:

 // Create an ArrayAdapter ArrayAdapter<CharSequence> mAdapter = ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item); // State B mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

И, если у вас этого нет, добавьте его в значения / styles.xml:

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:spinnerItemStyle">@style/TextViewSpinnerItem</item> </style> <style name="TextViewSpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem"> <item name="android:paddingLeft">0dp</item> <item name="android:paddingRight">0dp</item> </style> 

Вы также должны создавать values-v21/styles.xml и добавлять:

 <style name="TextViewSpinnerItem" parent="@android:style/Widget.Material.TextView.SpinnerItem"> <item name="android:paddingLeft">0dp</item> <item name="android:paddingRight">0dp</item> </style>