TextView получает разрез в некоторых разрешениях
У меня есть RecyclerView
, который состоит из CardView
, у которого есть TextView
и ImageView
, среди некоторых других макетов.
Проблема в том, что в некоторых разрешениях экрана TextView
отключается или запирается на следующую строку, чего я не хочу.
В других резолюциях, TextView
имеет много места.
Малые разрешения:
![Small]()
Высокие разрешения:
![введите описание изображения здесь]()
Как организовать компоновку, чтобы было достаточно места для TextView
, а размер ImageView
будет соответствующим образом определен?
Это мой xml для элементов RecyclerView
:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview="http://schemas.android.com/apk/res-auto"
android:id="@+id/zmanCard"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
cardview:cardUseCompatPadding="false"
cardview:cardPreventCornerOverlap="false"
cardview:cardCornerRadius="4dp"
cardview:cardElevation="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorPrimary"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="top"
android:gravity="center"
android:orientation="vertical"
android:background="?attr/colorPrimaryDark">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/zmanCardTitle"
android:textColor="#ffffff"
android:gravity="center"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="24dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="4dp"
android:alpha="0.8"
android:id="@+id/zmanCardImage" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="7dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="4dp">
<TextView
android:text="5:40"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:id="@+id/zmanCardTime"
android:textColor="#ffffff"
android:textSize="18sp" />
<ProgressBar
android:id="@+id/zmanProgressBar"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="top|left"
style="@style/Base.Widget.AppCompat.ProgressBar" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
Ответы
Ответ 1
Попробуйте это. Работает 100%.
AutoResizeTextView или sdp unit может помочь вам.
sdp - единица масштабируемого размера
Андроид SDK, который предоставляет новый размер - sdp (масштабируемый dp). Этот размерный блок масштабируется с размером экрана. Это может помочь разработчикам Android с поддержкой нескольких экранов.
для текстовых просмотров, пожалуйста, обратитесь к ssp, который основан на блоке размера sp для текстов.
https://github.com/intuit/sdp
Автомасштабировать текст TextView для вставки в пределах.
И если вы хотите поддерживать различные макеты для разных экранов:
res/layout/my_layout.xml // layout for normal screen size ("default")
res/layout-small/my_layout.xml // layout for small screen size
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation
За дополнительной информацией посмотрите здесь
Ответ 2
![введите описание изображения здесь]()
TextView, который автоматически изменяет размер текста в соответствии с его границами.
Использование:
dependencies {
compile 'me.grantland:autofittextview:0.2.+'
}
Включить любой вид, расширяющий TextView в коде:
AutofitHelper.create(textView);
Разрешить любой просмотр, расширяющий TextView в XML:
<me.grantland.widget.AutofitLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
/>
</me.grantland.widget.AutofitLayout>
Используйте встроенный виджет в коде или XML:
<RootElement
xmlns:autofit="http://schemas.android.com/apk/res-auto"
...
<me.grantland.widget.AutofitTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:maxLines="2"
android:textSize="40sp"
autofit:minTextSize="16sp"
/>
Ссылка ссылки: https://github.com/grantland/android-autofittextview
Ответ 3
Я могу предложить двухэтапное решение для вашего текстового размера, поэтому с атрибутом wrap_content
он подходит для текста, и я предлагаю использовать квалификатор, чтобы предоставить несколько альтернативных макетов для ориентации на различные конфигурации экрана. Вы делаете это, используя квалификаторы конфигурации, которые позволяют времени выполнения автоматически выбирать соответствующий ресурс на основе конфигурации текущих устройств (например, другой дизайн макета для разных размеров экрана). Поддержка различных размеров экрана
от этой части до конца я скопировал свой ответ из этой ссылки из ответа @Herry:
Я думаю, вам нужно проверить этот Google IO Pdf для дизайна. В этом pdf перейдите на страницу №: 77, в которой вы найдете, как предлагать для использования dimens.xml
для разных устройств Android, например, см. Ниже структуру:
RES/значения/dimens.xml
RES/значения-малый/dimens.xml
RES/значения нормальный /dimens.xml
RES/значения-большой/dimens.xml
RES/значения-XLarge/dimens.xml
для примера, который вы использовали ниже dimens.xml в значениях.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="text_size">18sp</dimen>
</resources>
В другой папке значений вам нужно изменить значения для вашего размера текста.
например:
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="font_size_small">10sp</dimen>
<dimen name="font_size_medium">20sp</dimen>
<dimen name="font_size_large">30sp</dimen>
</resources>
Ответ 4
Если вам нужны масштабируемые экраны, вы не должны использовать фиксированную высоту или ширину как можно больше. В вашем случае вы должны пропорционально распределять компоненты с помощью layout_weight.
Подробнее см.
Что означает андроид: layout_weight?
Ответ 5
Для более простого способа создания макета используйте относительный макет с некоторой надлежащей техникой, которую он разрешит. если все еще есть проблема, спросите меня .xml файл
Ответ 6
Вы должны использовать отступы, чтобы в тексте всегда было определенное фиксированное заполнение, и оно никогда не обрезается.
В коде введите следующие изменения
<TextView
android:text="5:40"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:id="@+id/zmanCardTime"
android:textColor="#ffffff"
android:padding:"3dp"
android:textSize="18sp" />
Ответ 7
Здесь вы снова отправляетесь 2-го раза с ключевым словом
Разрешение
Какие у вас есть варианты теперь?
Просто подытожил эти ответы ( "все-в-одном" )! Остальные опции остались?
Как я вижу, ваша проблема связана с двумя руками в ручных случаях.
См. иногда TextView
сам пойдет вниз. Все другие варианты, которые вы можете избежать, вместо ваших решений, которые у вас есть?
Любое дополнительное преимущество этого? Да, это поддерживает размеры и поля на основе процентов. У вас установлен фиксированный размер, и это даст вам их с использованием процента. У него даже есть классный атрибут layout_aspectRatio
. Вот ссылка на небольшой учебник.
Дайте размеры, основанные на соотношении/абсолютной позиции вида
До PercentRelativeLayout
я в основном использовал это. Сначала вам нужно иметь образ модели/эскиз вашего представления.
Моя модель имеет высоту 1920 px и ширину 1080 (обычно это разрешение HDTV, соотношение сторон 16: 9).
В этом изображении мы знаем, где расположены представления.
![enter image description here]()
Тогда для любого вида/любого другого экрана я могу использовать такое же соотношение для размещения их с помощью LayoutParams
. Теперь просмотр остается в соответствии с вашими правилами.
Вот пример:
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
height = displaymetrics.heightPixels;
width = displaymetrics.widthPixels;
LinearLayout.LayoutParams topLenP= new LinearLayout.LayoutParams(300 * width / 1080, 400 * width / 1920);
//topLenP.topMargin = x* height / 1920;
//topLenP.leftMargin = y* width / 1080;
myView.setLayoutParams(topLenP);
Что я на самом деле сделал здесь, как я сказал в моем представлении модели, этот вид занимал 300 ширины, 400 в высоту, с этим я корректирую то же соотношение для моего экрана смородины (с использованием размера экрана смородины).
Возвращение к автоматическому масштабированию, так как теперь мы имеем представление о соотношении, основанном на соотношении, вот еще один хороший ответ.
Автонастройка TextView для Android
Android: textAppearance
Наконец, в андроиде \platforms\android-X\data\res\values\themes.xml
есть фиксированные размеры, основанные на малом, большом и среднем.
Без указания того, что вам точно нужно, вы также можете использовать его как
<TextView
android:textAppearance="?android:attr/textAppearance"
....
/>
Надеюсь, это поможет!
Ответ 8
попробуйте дать вес текстурному макету и макету imageview приведите вес 1 к обоим макетам
Ответ 9
Используйте AutoScaleTextView
AutoScaleTextView
принимает значение android:textSize
и использует его как предпочтительный размер текста. Вы также можете установить минимальный размер текста. По умолчанию для минимального размера текста используется 10dp
. AutoScaleTextView
теперь пытается взять максимальное значение между предпочтительным и минимальным размером, который вписывается в ширину представлений (с учетом отступов).
Пожалуйста, найдите полный класс AutoScaleTextView и его реализации ниже LINK
http://ankri.de/autoscale-textview/
Ответ 10
Решение 1
https://developer.android.com/guide/practices/screens_support.html
// The TEXT SIZE in dp
private static final float TEXT_SIZE_DP = 16.0f;
// Get the screen density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
int textSize = (int) (TEXT_SIZE_DP * scale + 0.5f);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize);
Решение 2:
float dpi = getResources().getDisplayMetrics().widthPixels;
dpi = dpi / 320;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,TEXT_SIZE_DP*dpi);
Как его работа ссылается ниже ссылки
http://canvasonandroid.blogspot.in/2016/04/how-to-scale-font-size-for-different.html
Примечание. Он будет работать только на устройстве, а не на планшете. нам нужно написать другую логику для планшета. для этого вам нужно установить размер шрифта в dimen.xml
Ответ 11
Я думаю, вы не должны исправлять spanCount
от GridLayout
. Было бы лучше, если бы в high resolutions
вы отобразили 4 элемента, для small resolutions
вы отобразите 3 элемента, для landscape display
5 элементов,...
Для этого вы должны создать папку constants
для всех значений, которую вы будете поддерживать, например
res/values-small/dimens.xml
constants.xml
res/values-large/dimens.xml
constants.xml
для каждого constants.xml
, он будет выглядеть как
<resources>
<integer name="span_count">3</integer>
</resources>
Затем, когда вы создаете GridLayoutManager
GridLayoutManager lm = new GridLayoutManager(Context context, getContext().getResources().getInteger(R.integer.span_count));
После того, как вы сделаете это, ваша проблема не произойдет
Ответ 12
Мой опыт работы в android. Я всегда использую dp вместо sp, поэтому u исправляет значение dp для всех ваших текстовых просмотров и подходит для любого экрана.
Сообщите мне, если есть какие-либо проблемы.
Лучшие рекорды