TextView сокращается в некоторых разрешениях
У меня есть RecyclerView
который состоит из CardView
с, которые имеют TextView
и ImageView
среди некоторых других макетов.
Проблема в том, что в некоторых разрешениях экрана TextView
меня обрезают или толкают на следующую строчку, чего я не хочу.
В других резолюциях TextView
есть много места.
Как организовать макет так, чтобы было достаточно места для 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>
12 ответов
Попробуй это. Работает на 100%.
AutoResizeTextView или блок SDP может помочь вам.
SDP - масштабируемая единица измерения
Android SDK, который предоставляет новую единицу размера - sdp (масштабируемый дп). Эта единица измерения размера зависит от размера экрана. Это может помочь разработчикам Android с поддержкой нескольких экранов.
для просмотра текста, пожалуйста, обратитесь к ssp, который основан на единице размера sp для текстов.
Автоматическое масштабирование текста 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
Для получения дополнительной информации смотрите здесь
Я могу предложить два шага, один для вашего размера текста, так что с 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
Например, вы использовали ниже размеры. 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>
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
Я думаю, что вы не должны исправлять 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));
После того, как вы это сделаете, ваша проблема не произойдет
Если вы хотите масштабируемые экраны, вам не следует использовать фиксированную высоту или ширину в максимально возможной степени. В вашем случае вы должны разместить ваши компоненты пропорционально с layout_weight.
Больше подробностей;
Вы должны использовать отступы, чтобы у textview всегда был фиксированный отступ, и он никогда не обрезался. В вашем коде внесите следующие изменения
<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" />
Здесь вы идете снова во второй раз с ключевым словом
разрешение
Какие варианты у вас сейчас под рукой?
1 Несколько макетов 2. Несколько размеров
- Использование атрибута Weight_sum
- Библиотеки GitHub, такие как AutoFitTextView, SDP
Просто суммировал эти ответы (все в одном)! какие-нибудь другие варианты остались?
Как я вижу, ваша проблема связана с двумя случаями из рук в руки.
Видать иногда TextView
Сам по себе пойдем вниз. Есть ли другие варианты, которые вы можете попытаться избежать этого, вместо ваших решений, которые у вас есть?
PercentRelativeLayout
Есть ли дополнительное преимущество в этом? Да, это поддерживает измерения и поля в процентах. Вы установили фиксированные поля, и это даст вам их в процентах. У него даже есть классный атрибут, который называется layout_aspectRatio
, Вот ссылка на небольшой учебник.
Приведите размеры, основанные на соотношении / абсолютной позиции вида
До PercentRelativeLayout
Я в основном использовал это. Сначала вам нужно иметь изображение модели / эскиз вашего вида. Моя модель имеет высоту 1920 пикселей и ширину 1080 (обычно это разрешение HDTV, соотношение сторон 16:9)
На этом изображении мы знаем, где расположены виды.
Тогда для любого вида / любого другого экрана я могу использовать то же соотношение, чтобы расположить их, используя 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
андроид: textAppearance
Наконец-то есть фиксированные размеры в андроиде \platforms\android-X\data\res\values\themes.xml
на основе малого, большого и среднего.
Не указывая, что именно вам нужно, вы также можете использовать его как
<TextView
android:textAppearance="?android:attr/textAppearance"
....
/>
Надеюсь это поможет!
Для более простого способа создайте свой макет, используя относительный макет с некоторой надлежащей техникой, которая наверняка разрешится. если проблема не устранена, спросите меня.xml файл
Попробуйте придать вес макету просмотра текста, а макет просмотра изображения придайте вес 1 обоим макетам
Решение 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's 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
Примечание: он будет работать только на устройстве, а не на планшете. нам нужно написать другую логику для планшета. для этого вам нужно установить размер шрифта в dimension.xml
Использование AutoScaleTextView
AutoScaleTextView
принимает android:textSize
значение и использует его в качестве предпочтительного размера текста. Вы также можете установить минимальный размер текста. Минимальный размер текста по умолчанию: 10dp
, AutoScaleTextView
теперь пытается получить максимальное значение между предпочтительным и минимальным размером, которое вписывается в ширину видов (с учетом отступов).
Пожалуйста, найдите полный класс AutoScaleTextView и его реализации ниже LINK
Мой опыт работы с Android Я всегда использую dp вместо sp, так что вы фиксируете значение dp для всех ваших текстовых обзоров и подходите под любой экран.
Дайте мне знать, если возникнет проблема.
Best Regds