Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

15.02.2016, 13:45. Просмотров 1045. Ответов 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. Как это сделать автоматически в разметке/стиле или как то в одном месте в коде? Как то может быть через атрибуты. Подскажите пожалуйста, а то всю голову уже сломал! Я думаю с аналогичной проблемой разработчики сталкиваются часто и должно быть какое то красивое решение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2016, 13:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как автоматически изменять размер текста в spinner в зависимости от размера экрана? (Программирование Android):

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

Как сделать так, чтобы мобильное приложение автоматически подстраивалось под размер экрана? - Программирование Android
В Android Studio мы же под определенную диагональ создаём приложение (один эмулятор).. Как при разработке сделать так, чтобы мобильное...

Изменение размера картинок в зависимости от разрешения экрана - Программирование Android
Пишу приложение на Java для Android. Столкнулся с проблемой, что при использование шаблона xml для стандартных размеров экрана 480*800...

Как подгонять размер диалоговых окон по размер экрана? - Программирование Android
Здравствуйте! Как подгонять размер диалоговых окон по размер экрана? У меня есть класс, унаследованный от DialogFragment. При запуске...

В зависимости от позиции Spinner-а менять текст в TextView - Программирование Android
Здравствуйте, только познаю андроид, так что сильно не ругайте. Создал спинер, его задача в зависимости от позиции менять текст в...

Правое выравнивание текста в Spinner - Программирование Android
Случилась у меня вот такая проблема, сколько я не бился, но и решить или понять почему так я не могу. Предупреждаю, что в Android я чайник....

16
Pablito
2549 / 2031 / 633
Регистрация: 12.05.2014
Сообщений: 7,149
Завершенные тесты: 1
15.02.2016, 13:52 #2
так сделай как и для лаяутов, например папку values-large
и создай там файл styles.xml с нужными размерами шрифта

я бы такие стили, которые для разных экранов - вынес в отдельный файл, ну например spinner_styles.xml
и положил бы их по папкам
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
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.
1
Pablito
15.02.2016, 14:11
  #4

Не по теме:

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

0
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
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
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
15.02.2016, 14:15 #6
Цитата Сообщение от VV0lk Посмотреть сообщение
Нет у спиннера, как такового свойства textSize
Ну да, это нужно на его элемент списка вешать, тут написано как.
0
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
15.02.2016, 14:19  [ТС] #7
Ну да, это нужно на его элемент списка вешать, тут написано как.
Это я читал, и это работает, когда контент загружаешь в коде, через адаптер, а как быть если мне не надо грузить контент через адаптер, а он у меня задан через entries="@array/SDR_str_arr"
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
15.02.2016, 14:22 #8
Цитата Сообщение от VV0lk Посмотреть сообщение
а как быть если мне не надо грузить контент через адаптер
Никак. В этом случае используются стандартные вьюшки для списка и доступа к ним нет (ну может из кода и можно добраться, но зачем, если адаптер удобнее?).
0
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
15.02.2016, 14:34  [ТС] #9
Хотя вот здесь http://stackoverflow.com/questions/1...oes-not-change в 19 -ом сообщении говорят, что вроде как можно. Но что то так пока у меня не получилось.
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
15.02.2016, 14:43 #10
Цитата Сообщение от VV0lk Посмотреть сообщение
говорят, что вроде как можно
Ну да, можно и так. Только зачем это все воротить, если 1 строкой можно воткнуть свою разметку?
0
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
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
Pablito
2549 / 2031 / 633
Регистрация: 12.05.2014
Сообщений: 7,149
Завершенные тесты: 1
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
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
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" />

Он открывается нормально и выглядит как надо, за исключением стандартного треугольничка спиннера в нижнем правом углу, который напрягает. Скриншоты см. во вложении.
0
Миниатюры
Как автоматически изменять размер текста в spinner в зависимости от размера экрана?   Как автоматически изменять размер текста в spinner в зависимости от размера экрана?  
Pablito
2549 / 2031 / 633
Регистрация: 12.05.2014
Сообщений: 7,149
Завершенные тесты: 1
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
VV0lk
11 / 1 / 0
Регистрация: 25.12.2011
Сообщений: 171
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
16.02.2016, 13:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2016, 13:37
Привет! Вот еще темы с ответами:

Сохранение текста из Spinner а в базу SQLite - Программирование Android
Уважаемые гуру, прошу помощи. Имеется несколько данные (массив) в Spinner е и кнопка. При нажатии кнопки данные из Spinnera должны...

Изменять изображение в зависимости от количества нажатий - Программирование Android
Всем привет , помогите нубу) Как сделать чтобы , кликая на кнопку, допустим 100 раз появилось изображение ,200 раз другое public class...

RecyclerView создает Item на размер экрана, как исправить? - Программирование Android
Аномалии, сменил версию RecyclerView с 21.0.+ на 23.3.0. Теперь он создает 1 элемент на весь размер экрана. Т.е элемент CardView создается...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.