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-го раза с ключевым словом

Разрешение

Какие у вас есть варианты теперь?

Просто подытожил эти ответы ( "все-в-одном" )! Остальные опции остались?

Как я вижу, ваша проблема связана с двумя руками в ручных случаях.

  • Конечно, ваш текст не изменяет размер 2. Ваш макет слишком гибкий.

    введите описание изображения здесь

См. иногда TextView сам пойдет вниз. Все другие варианты, которые вы можете избежать, вместо ваших решений, которые у вас есть?

PercentRelativeLayout

Любое дополнительное преимущество этого? Да, это поддерживает размеры и поля на основе процентов. У вас установлен фиксированный размер, и это даст вам их с использованием процента. У него даже есть классный атрибут 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 для всех ваших текстовых просмотров и подходит для любого экрана.

Сообщите мне, если есть какие-либо проблемы.

Лучшие рекорды