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 для текстов.

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

Для получения дополнительной информации смотрите здесь

Я могу предложить два шага, один для вашего размера текста, так что с 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.

Больше подробностей;

Что означает Android: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. Ваш макет слишком гибкий.

Видать иногда 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

http://ankri.de/autoscale-textview/

Мой опыт работы с Android Я всегда использую dp вместо sp, так что вы фиксируете значение dp для всех ваших текстовых обзоров и подходите под любой экран.

Дайте мне знать, если возникнет проблема.

Best Regds

Другие вопросы по тегам