Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте. В программе использую две темы светлую и темную:
Кликните здесь для просмотра всего текста
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. Как это сделать автоматически в разметке/стиле или как то в одном месте в коде? Как то может быть через атрибуты. Подскажите пожалуйста, а то всю голову уже сломал! Я думаю с аналогичной проблемой разработчики сталкиваются часто и должно быть какое то красивое решение.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2016, 13:45
Ответы с готовыми решениями:

При изменении размера QMainWindow, автоматически изменять размер QTableView
Привет, форумчане. Как всегда - &quot;I need help&quot;. Каким образом изменять размер QTableView, при...

Изменять размер формы в зависимости от текста в Label
Есть форма, на ней лежит Label. Текст, помещаемый в Label, может состоять из пары предложений, а...

Изменять размер текста в SpeedButton в зависимости от размеров кнопки
Как сделать, что бы название кнопки speedbutton уменьшалось или увеличивалось в зависимости он...

Изменить размер блока в зависимости от размера экрана
Нужно сделать так, чтобы если размер экрана меньше 768 пикселей, то ширина всех элементов с классом...

16
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
15.02.2016, 13:52 2
так сделай как и для лаяутов, например папку values-large
и создай там файл styles.xml с нужными размерами шрифта

я бы такие стили, которые для разных экранов - вынес в отдельный файл, ну например spinner_styles.xml
и положил бы их по папкам
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
15.02.2016, 13:57 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.
2
Pablito
15.02.2016, 14:11
  #4

Не по теме:

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

0
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
15.02.2016, 14:12  [ТС] 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."
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
15.02.2016, 14:15 6
Цитата Сообщение от VV0lk Посмотреть сообщение
Нет у спиннера, как такового свойства textSize
Ну да, это нужно на его элемент списка вешать, тут написано как.
0
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
15.02.2016, 14:19  [ТС] 7
Ну да, это нужно на его элемент списка вешать, тут написано как.
Это я читал, и это работает, когда контент загружаешь в коде, через адаптер, а как быть если мне не надо грузить контент через адаптер, а он у меня задан через entries="@array/SDR_str_arr"
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
15.02.2016, 14:22 8
Цитата Сообщение от VV0lk Посмотреть сообщение
а как быть если мне не надо грузить контент через адаптер
Никак. В этом случае используются стандартные вьюшки для списка и доступа к ним нет (ну может из кода и можно добраться, но зачем, если адаптер удобнее?).
0
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
15.02.2016, 14:34  [ТС] 9
Хотя вот здесь http://stackoverflow.com/quest... not-change в 19 -ом сообщении говорят, что вроде как можно. Но что то так пока у меня не получилось.
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
15.02.2016, 14:43 10
Цитата Сообщение от VV0lk Посмотреть сообщение
говорят, что вроде как можно
Ну да, можно и так. Только зачем это все воротить, если 1 строкой можно воткнуть свою разметку?
0
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
15.02.2016, 17:15  [ТС] 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" />

Получилось, размер шрифта поменялся, но пропал стиль оформления в развернутом состоянии, заданный в теме приложения...
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
15.02.2016, 18:50 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
0
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
16.02.2016, 13:28  [ТС] 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 в зависимости от размера экрана?  
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.02.2016, 13:34 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" />
0
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
16.02.2016, 13:37  [ТС] 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" />
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.02.2016, 13:41 16
тогда я сливаюсь
я вообще весь код который выкладываю не копипастю со стековерфлов, а проверяю на тестовых проектиках если вопрос интересный
и эти все строки что выше я выложил - они рабочие, а как там xamarin-е х.з.

в стиле приложения добавлены те две строчки?
XML
1
2
<item name="android:spinnerItemStyle">@style/MySpinnerStyle</item>
        <item name="android:spinnerDropDownItemStyle">@style/MySpinnerPopupStyle</item>
0
12 / 2 / 1
Регистрация: 25.12.2011
Сообщений: 181
16.02.2016, 13:49  [ТС] 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" />

И видно что код работает, величина шрифта меняется, но только вот этот спиннер почему то стал некликабельным!... Как так?
0
16.02.2016, 13:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2016, 13:49
Помогаю со студенческими работами здесь

Меняем цвет, размер и положение в зависимости от размера экрана
Я просто для себя кое что делаю, а мануала на Русском ни где нет, вот и думаю, может тоже кому...

Нужно изменять размер шрифта в ActiveX в зависимости от размера самого ActiveX
Уважаемые, обратите пожалуйста внимание на вчерашний постинг под сабжем 'ActiveX - динамич....

Как сменить размер текста у Spinner
Здравствуйте! Как сменить размер текста у Spinner`а?

Можно ли сделать размер текста зависимым от размера экрана?
Например, если размер экрана меньше 1025 пикселей, то размер текста на странице 15px, если экран...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru