Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
#1

Как автоматически изменять размер текста в spinner в зависимости от размера экрана? - Android

15.02.2016, 13:45. Просмотров 642. Ответов 16
Метки нет (Все метки)

Здравствуйте. В программе использую две темы светлую и темную:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<style name="BlackTheme"  parent="android:style/Theme.Holo">
    <item name="android:colorBackground">@color/Black</item>
    <item name= "android:spinnerStyle">@style/spinner_style_black</item>
    <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItem_Black</item>
    <item name="Direct_Theme_color">@color/ActionBar_Dark</item>
    <item name="Inverse_Theme_color">@color/White</item>
    <item name="Grid_Graph_Theme_color">@color/Grid_Color_for_Black</item>
</style>
 
 
 
<style name="WhiteTheme"  parent="android:style/Theme.Holo.Light" >
    <item name="android:colorBackground">@color/White</item>
    <item name= "android:spinnerStyle">@style/spinner_style_white</item>
    <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItem_White</item>
    <item name="Direct_Theme_color">@color/ActionBar_Light</item>
    <item name="Inverse_Theme_color">@color/Black</item>
    <item name="Grid_Graph_Theme_color">@color/Grid_Color_for_White</item>
</style>

В них определены стили спиннера:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<style name="spinner_style_black" parent="@android:style/Widget.Spinner">
    <item name="android:background">@drawable/gradient_spinner_black</item>
    <item name="android:layout_marginLeft">5dp</item>
    <item name="android:layout_marginRight">5dp</item>
    <item name="android:layout_marginBottom">5dp</item>
    <item name="android:paddingLeft">6dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:paddingBottom">4dp</item>
    <item name="android:popupBackground">#2A5FB1</item> 
</style>
 
<style name="spinner_style_white" parent="@android:style/Widget.Spinner">
    <item name="android:background">@drawable/gradient_spinner_white</item>
    <item name="android:layout_marginLeft">5dp</item>
    <item name="android:layout_marginRight">5dp</item>
    <item name="android:layout_marginBottom">5dp</item>
    <item name="android:paddingLeft">6dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:paddingBottom">4dp</item>
    <item name="android:popupBackground">#2A5FB1</item> 
</style>
 
<style name="SpinnerDropDownItem_Black" parent="@android:style/Widget.DropDownItem.Spinner">
    <item name="android:background">#ff2A5FB1</item>
    <item name="android:textColor">#ffffffff</item>
   <item name="android:checkMark">@drawable/edited_radio</item>
</style>
 
<style name="SpinnerDropDownItem_White" parent="@android:style/Widget.DropDownItem.Spinner">
    <item name="android:background">#ff2A5FB1</item>
    <item name="android:textColor">#ff000000</item>
    <item name="android:checkMark">@drawable/edited_radio</item>
</style>

Ну и сам спиннер, например, с загруженным из ресурсов контентом:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
 <Spinner
                p1:layout_width="0dp"
                p1:layout_weight="0.3"
                p1:layout_height="match_parent"
                p1:id="@+id/spinner2"
                p1:entries="@array/SDR_str_arr"
                p1:layout_marginLeft="3dp"
                p1:layout_marginTop="4dp"
                p1:layout_marginRight="210dp"
                p1:layout_marginBottom="6dp" />


Размер шрифта в спиннере использовался стандартный, по умолчанию. Сейчас адаптируя разметку под размеры -large и -extra-large понял, что необходимо менять размер шрифта spinner (да и не только) в зависимости от размера экрана текущего девайса. Ну например так для обычного размера - textSize у всех спиннеров должен быть равен 18dp, для -large = 30dp, для -extra-large = 50dp. Как это сделать автоматически в разметке/стиле или как то в одном месте в коде? Как то может быть через атрибуты. Подскажите пожалуйста, а то всю голову уже сломал! Я думаю с аналогичной проблемой разработчики сталкиваются часто и должно быть какое то красивое решение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2016, 13:45     Как автоматически изменять размер текста в spinner в зависимости от размера экрана?
Посмотрите здесь:

Сохранение текста из Spinner а в базу SQLite Android
Размер экрана без шапки Android
Android Изменение размера картинок в зависимости от разрешения экрана
Android Физический размер экрана
Масштабирование картинки в зависимости от разрешения экрана Android
Android Orientation в зависимости от пропорций экрана
Android Как сменить размер текста у Spinner
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2063 / 1805 / 562
Регистрация: 12.05.2014
Сообщений: 6,432
Завершенные тесты: 1
15.02.2016, 13:52     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #2
так сделай как и для лаяутов, например папку values-large
и создай там файл styles.xml с нужными размерами шрифта

я бы такие стили, которые для разных экранов - вынес в отдельный файл, ну например spinner_styles.xml
и положил бы их по папкам
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
15.02.2016, 13:57     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #3
VV0lk, создаем папки values, values-large, values-xlarge в папке res. Кладем туда по файлу dimens.xml. В каждом пишем
XML
1
2
3
<resources>
    <dimen name="spinner_text_size">Xsp</dimen>//X меняем на реальный размер для этого размера экрана.
</resources>
И в разметке используем ссылку на ресурс вместо числа
XML
1
android:textSize="@dimen/spinner_text_size"
И размер текста нужно указывать в sp, а не в dp.
Паблито
15.02.2016, 14:11
  #4

Не по теме:

да, я затупил, когда-то сам так советовал делать
dimens.xml красивее и оптимальнее

VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
15.02.2016, 14:12  [ТС]     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #5
Нет у спиннера, как такового свойства textSize. И вот такой способ результата не дает..
android:textSize="@dimen/spinner_text_size"
так сделай как и для лаяутов, например папку values-large
и создай там файл styles.xml с нужными размерами шрифта
Хорошая мысль! Попробовал, создал:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<style name="spinner_style_black" parent="@android:style/Widget.Spinner">
    <item name="android:background">@drawable/gradient_spinner_black</item>
    <item name="android:layout_marginLeft">5dp</item>
    <item name="android:layout_marginRight">5dp</item>
    <item name="android:layout_marginBottom">5dp</item>
    <item name="android:paddingLeft">6dp</item>
    <item name="android:paddingTop">4dp</item>
     <item name="android:textSize">30dp</item>
    <item name="android:paddingBottom">4dp</item>
    <item name="android:popupBackground">#2A5FB1</item> 
</style>
 
<style name="spinner_style_white" parent="@android:style/Widget.Spinner">
    <item name="android:background">@drawable/gradient_spinner_white</item>
    <item name="android:layout_marginLeft">5dp</item>
    <item name="android:layout_marginRight">5dp</item>
    <item name="android:layout_marginBottom">5dp</item>
    <item name="android:paddingLeft">6dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:paddingBottom">4dp</item>
      <item name="android:textSize">30dp</item>
    <item name="android:popupBackground">#2A5FB1</item> 
</style>
 
 
 
 
 
<style name="SpinnerDropDownItem_Black" parent="@android:style/Widget.DropDownItem.Spinner">
    <item name="android:background">#ff2A5FB1</item>
    <item name="android:textColor">#ffffffff</item>
    <item name="android:textSize">30dp</item>
   <item name="android:checkMark">@drawable/edited_radio</item>
</style>
 
<style name="SpinnerDropDownItem_White" parent="@android:style/Widget.DropDownItem.Spinner">
    <item name="android:background">#ff2A5FB1</item>
    <item name="android:textColor">#ff000000</item>
      <item name="android:textSize">30dp</item>
    <item name="android:checkMark">@drawable/edited_radio</item>
</style>

Так вот в раскрытом состоянии размер шрифта поменялся, а вот в свернутом нет.. Видимо по той же причине: "Нет у спиннера, как такового свойства textSize."
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
15.02.2016, 14:15     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #6
Цитата Сообщение от VV0lk Посмотреть сообщение
Нет у спиннера, как такового свойства textSize
Ну да, это нужно на его элемент списка вешать, тут написано как.
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
15.02.2016, 14:19  [ТС]     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #7
Ну да, это нужно на его элемент списка вешать, тут написано как.
Это я читал, и это работает, когда контент загружаешь в коде, через адаптер, а как быть если мне не надо грузить контент через адаптер, а он у меня задан через entries="@array/SDR_str_arr"
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
15.02.2016, 14:22     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #8
Цитата Сообщение от VV0lk Посмотреть сообщение
а как быть если мне не надо грузить контент через адаптер
Никак. В этом случае используются стандартные вьюшки для списка и доступа к ним нет (ну может из кода и можно добраться, но зачем, если адаптер удобнее?).
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
15.02.2016, 14:34  [ТС]     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #9
Хотя вот здесь http://stackoverflow.com/questions/1...oes-not-change в 19 -ом сообщении говорят, что вроде как можно. Но что то так пока у меня не получилось.
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
15.02.2016, 14:43     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #10
Цитата Сообщение от VV0lk Посмотреть сообщение
говорят, что вроде как можно
Ну да, можно и так. Только зачем это все воротить, если 1 строкой можно воткнуть свою разметку?
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
15.02.2016, 17:15  [ТС]     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #11
Ну в принципе да, придется переделать все спинеры через адаптер отдельный spinner_item.xml и dimen у его textSize.

Добавлено через 2 часа 26 минут
Сделал через:
C#
1
view.FindViewById<Spinner> (Resource.Id.spinner1).Adapter = new ArrayAdapter<String>(Activity, Resource.Layout.main_spinner_item, Resources.GetStringArray(Resource.Array.weather ));
Где main_spinner_item.xml
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="@dimen/spinner_text_size" />

Получилось, размер шрифта поменялся, но пропал стиль оформления в развернутом состоянии, заданный в теме приложения...
Паблито
2063 / 1805 / 562
Регистрация: 12.05.2014
Сообщений: 6,432
Завершенные тесты: 1
15.02.2016, 18:50     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #12
если я правильно понял задачу
1. создаем стили для спиннера и его выпадающего списка
XML
1
2
3
4
5
6
7
8
9
10
    <style name="MySpinnerStyle" parent="Base.Widget.AppCompat.TextView.SpinnerItem">
        <item name="android:textSize">20sp</item>
        <item name="android:textColor">@color/colorAccent</item>
        <item name="popupTheme">@style/MySpinnerPopupStyle</item>
    </style>
 
    <style name="MySpinnerPopupStyle" parent="Base.Widget.AppCompat.DropDownItem.Spinner">
        <item name="android:textSize">30sp</item>
        <item name="android:textColor">@color/colorPrimary</item>
    </style>
2. в стиль приложения добавляем строки
XML
1
2
        <item name="android:spinnerItemStyle">@style/MySpinnerStyle</item>
        <item name="android:spinnerDropDownItemStyle">@style/MySpinnerPopupStyle</item>
3. и сам спиннер
XML
1
2
3
4
    <android.support.v7.widget.AppCompatSpinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
4. PROFIT
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
16.02.2016, 13:28  [ТС]     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #13
Попробовал сделать так. Ну немножко изменив стили под свои нужды:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
<style name="MySpinnerStyle" parent="Base.Widget.AppCompat.TextView.SpinnerItem">
        <item name="android:textSize">30sp</item> 
        <item name="android:background">@drawable/gradient_spinner_black</item>
        <item name="popupTheme">@style/MySpinnerPopupStyle</item>
    </style>
 
 
    <style name="MySpinnerPopupStyle" parent="Base.Widget.AppCompat.DropDownItem.Spinner">
        <item name="android:textSize">35sp</item>
        <item name="android:background">#ff2A5FB1</item>
        <item name="android:checkMark">@drawable/edited_radio</item>
    </style>

Так вот, на фрагменте два спиннера, тот который помечен как <android.support.v7.widget.AppCompatSpinner />
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
<android.support.v7.widget.AppCompatSpinner
                p1:layout_width="0dp"
                p1:layout_weight="0.3"
                p1:layout_height="match_parent"
                p1:id="@+id/spinner1"
                p1:entries="@array/weather"
                p1:layout_marginLeft="3dp"
                p1:layout_marginTop="3dp"
                p1:layout_marginRight="210dp"
                p1:layout_marginBottom="3dp" />

с внешним видом у него всё хорошо, но только он не открывается при нажатии!
А вот обычный спиннер:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
 <Spinner
                p1:layout_width="0dp"
                p1:layout_weight="0.3"
                p1:layout_height="match_parent"
                p1:id="@+id/spinner2"
                p1:entries="@array/standard_welding"
                p1:layout_marginLeft="3dp"
                p1:layout_marginTop="3dp"
                p1:layout_marginRight="210dp"
                p1:layout_marginBottom="3dp" />

Он открывается нормально и выглядит как надо, за исключением стандартного треугольничка спиннера в нижнем правом углу, который напрягает. Скриншоты см. во вложении.
Миниатюры
Как автоматически изменять размер текста в spinner в зависимости от размера экрана?   Как автоматически изменять размер текста в spinner в зависимости от размера экрана?  
Паблито
2063 / 1805 / 562
Регистрация: 12.05.2014
Сообщений: 6,432
Завершенные тесты: 1
16.02.2016, 13:34     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #14
зачем там p1 везде?
XML
1
2
3
4
5
6
7
8
9
10
    <android.support.v7.widget.AppCompatSpinner
        android:id="@+id/spinner1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="3dp"
        android:layout_marginLeft="3dp"
        android:layout_marginRight="210dp"
        android:layout_marginTop="3dp"
        android:layout_weight="0.3"
        android:entries="@array/weather" />
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
16.02.2016, 13:37  [ТС]     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #15
Потому что при создании этой разметки в стандартном дизайнере Xamarin Studio, она генерит примерно следующее:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<ScrollView xmlns:p1="http://schemas.android.com/apk/res/android"
    p1:minWidth="25px"
    p1:minHeight="25px"
    p1:layout_width="match_parent"
    p1:fillViewport="true"
    p1:layout_height="match_parent"
    p1:id="@+id/scrollView1">
    <LinearLayout
        p1:orientation="vertical"
        p1:layout_width="match_parent"
        p1:layout_height="match_parent"
        p1:id="@+id/linearLayout1">
        <TextView
            p1:text="@string/external_envir"
            p1:textAppearance="?android:attr/textAppearanceMedium"
            p1:layout_width="match_parent"
            p1:layout_height="wrap_content"
            p1:id="@+id/textView3"
            p1:gravity="center"
            p1:textColor="#ff2A5FB1"
            p1:textStyle="bold"
            p1:textSize="32dp"
            p1:layout_margin="4dp" />
        <View
            p1:layout_width="match_parent"
            p1:layout_height="2dp"
            p1:id="@+id/view1"
            p1:background="@drawable/separator"
            p1:layout_marginLeft="4dp"
            p1:layout_marginRight="4dp" />
        <LinearLayout
            p1:orientation="horizontal"
            p1:layout_width="match_parent"
            p1:layout_height="wrap_content"
            p1:id="@+id/linearLayout2"
            p1:layout_margin="5dp">
            <TextView
                p1:text="@string/weather"
                p1:textAppearance="?android:attr/textAppearanceMedium"
                p1:layout_width="0dp"
                p1:layout_height="match_parent"
                p1:id="@+id/textView1"
                p1:layout_weight="0.5"
                p1:gravity="center"
                p1:layout_margin="3dp"
                p1:textSize="30dp" />
            <android.support.v7.widget.AppCompatSpinner
                p1:layout_width="0dp"
                p1:layout_weight="0.3"
                p1:layout_height="match_parent"
                p1:id="@+id/spinner1"
                p1:entries="@array/weather"
                p1:layout_marginLeft="3dp"
                p1:layout_marginTop="3dp"
                p1:layout_marginRight="210dp"
                p1:layout_marginBottom="3dp" />
Паблито
2063 / 1805 / 562
Регистрация: 12.05.2014
Сообщений: 6,432
Завершенные тесты: 1
16.02.2016, 13:41     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #16
тогда я сливаюсь
я вообще весь код который выкладываю не копипастю со стековерфлов, а проверяю на тестовых проектиках если вопрос интересный
и эти все строки что выше я выложил - они рабочие, а как там xamarin-е х.з.

в стиле приложения добавлены те две строчки?
XML
1
2
<item name="android:spinnerItemStyle">@style/MySpinnerStyle</item>
        <item name="android:spinnerDropDownItemStyle">@style/MySpinnerPopupStyle</item>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2016, 13:49     Как автоматически изменять размер текста в spinner в зависимости от размера экрана?
Еще ссылки по теме:

В зависимости от позиции Spinner-а менять текст в TextView Android
Android Изменять изображение в зависимости от количества нажатий
Android Как подгонять размер диалоговых окон по размер экрана?
Android Как сделать так, чтобы мобильное приложение автоматически подстраивалось под размер экрана?
Android RecyclerView создает Item на размер экрана, как исправить?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 169
16.02.2016, 13:49  [ТС]     Как автоматически изменять размер текста в spinner в зависимости от размера экрана? #17
В том что они рабочие, я не сомневаюсь! Я пытаюсь понять, почему конкретно в моем случае они не работают.
Вот сейчас у меня в папке values-large лежит файл themes.xml в нем прописано:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<style name="BlackTheme"  parent="android:style/Theme.Holo">
    <item name="android:spinnerItemStyle">@style/MySpinnerStyle</item>
    <item name="android:spinnerDropDownItemStyle">@style/MySpinnerPopupStyle</item>
 
    <item name="android:colorBackground">@color/Black</item>
    <item name="Direct_Theme_color">@color/ActionBar_Dark</item>
    <item name="Inverse_Theme_color">@color/White</item>
    <item name="Grid_Graph_Theme_color">@color/Grid_Color_for_Black</item>
</style>
 
 
 
<style name="WhiteTheme"  parent="android:style/Theme.Holo.Light" > 
    <item name="android:spinnerItemStyle">@style/MySpinnerStyle</item>
    <item name="android:spinnerDropDownItemStyle">@style/MySpinnerPopupStyle</item>
 
    <item name="Direct_Theme_color">@color/ActionBar_Light</item>
    <item name="Inverse_Theme_color">@color/Black</item>
    <item name="Grid_Graph_Theme_color">@color/Grid_Color_for_White</item>
    <item name="android:colorBackground">@color/White</item>
</style>

и файл styles.xml
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
   <style name="MySpinnerStyle" parent="Base.Widget.AppCompat.TextView.SpinnerItem">
        <item name="android:textSize">30sp</item>   
        <item name="popupTheme">@style/MySpinnerPopupStyle</item>
    </style>
 
 
    <style name="MySpinnerPopupStyle" parent="Base.Widget.AppCompat.DropDownItem.Spinner">
        <item name="android:textSize">35sp</item>
    </style>

В файле разметки:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
<android.support.v7.widget.AppCompatSpinner
                p1:layout_width="0dp"
                p1:layout_weight="0.3"
                p1:layout_height="match_parent"
                p1:id="@+id/spinner1"
                p1:entries="@array/weather"
                p1:layout_marginLeft="3dp"
                p1:layout_marginTop="3dp"
                p1:layout_marginRight="210dp"
                p1:layout_marginBottom="3dp" />

И видно что код работает, величина шрифта меняется, но только вот этот спиннер почему то стал некликабельным!... Как так?
Yandex
Объявления
16.02.2016, 13:49     Как автоматически изменять размер текста в spinner в зависимости от размера экрана?
Ответ Создать тему
Опции темы

Текущее время: 21:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru