2017-02-01 6 views
16

У меня есть RecyclerView, который состоит из CardView s, которые имеют TextView и ImageView, среди других макетов.
Проблема в том, что в некоторых разрешениях экрана TextView отключается или запирается на следующую строку, которую я не хочу.
В других резолюциях, TextView имеет достаточно места.TextView, получивший разрез в некоторых разрешениях

Малые разрешения:
Small

Высокие разрешения:
enter image description here

Как организовать макет так, что есть достаточно места для 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> 

+0

Использовать AutoResizeTextView и установить maxlines = 1 http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds –

+0

Привет. , вы попробовали AutoResizeTextView или sdp? –

+0

использовать вес для текстового просмотра и всех линейных просмотров –

ответ

10

Попробуйте это. Работает 100%.

AutoResizeTextView или sdp блок может вам помочь.

SDP - масштабируемый размер блока

Андроид SDK, который обеспечивает новый блок размера - sdp (масштабируемый дп). Этот размерный блок масштабируется с размером экрана. Это может помочь разработчикам Android с поддержкой нескольких экранов.

для текстовых представлений обратитесь к ssp, который основан на блоке размера sp для текстов.

https://github.com/intuit/sdp

Auto Scale TextView Text to Fit within Bounds

И если вы хотите поддерживать различные конструкции макета для различных экрана:

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 

Fore больше информации смотрите here

1

попытаться дать вес макета TextView и imageview макет дает вес 1 для обоих макетов

3

enter image description here

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

2

Если вы хотите масштабируемых экранов, Вы не должны использовать фиксированную высоту или ширину, насколько это возможно. В вашем случае вы должны распределить свои компоненты пропорционально layout_weight.

Для получения более подробной информации;

What does android:layout_weight mean?

+0

Если какой-то случай для пропорциональной компоновки мы должны использовать вес в LinearLayout, но я в основном предпочтительнее. Относительная компоновка помогает растянуть изображения. – Arpan24x7

3

Я могу предложить два шага решение один для текста размера так с wrap_content атрибутом становится нужным текстом и я предлагаю использовать классификатор, чтобы обеспечить несколько альтернативных макетов для различных целевых конфигураций экрана. Вы делаете это, используя квалификаторы конфигурации, которые позволяют времени выполнения автоматически выбирать соответствующий ресурс на основе конфигурации текущего устройства (например, другой дизайн макета для разных размеров экрана). Supporting Different Screen Sizes

из этой части до конца я скопировал мой ответ от this link от @ ответа Herry в: Я думаю, что вы должны проверить это Google IO Pdf for Design. В этом формате PDF перейти к Страница No: 77, в котором вы увидите, как там предлагая для использования dimens.xml для различных устройств Android, например, смотрите ниже структуры:

Рез/значения/dimens.xml

RES/значение-малое/dimens.xml

разреш/значение-нормальное/dimens.xml

разреша/значение Расширенного/dimens.xml

res/values-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> 
+0

Up-Voting this answer, потому что он просто копирует вставку и демонстрацию библиотеки других лиц. Эти типы ответов следует поощрять! –

2

Для более простого способа создания макета с использованием относительной раскладки с некоторыми собственно техником, что она рассосется. если все еще есть проблема, спросите меня .xml-файл

0

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

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

Лучшие Regds

+0

Я думаю, это не поможет –

2

Вы должны использовать отступы, так что 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

Использование AutoScaleTextView

AutoScaleTextView принимает значение android:textSize и использует его в качестве предпочтительного размера текста. Вы также можете установить минимальный размер текста. По умолчанию для минимального размера текста: 10dp. Теперь AutoScaleTextView пытается взять максимальное значение между предпочтительным и минимальным размером, который вписывается в ширину представлений (с учетом отступов).

Вы можете найти полный класс AutoScaleTextView и его реализации в ссылке ниже

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

2

Здесь вы идете снова 2-й раз с ключевым словом

Разрешение

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

Только что изложил эти ответы (Все-в-одном)! Остальные варианты остались?

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

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

    enter image description here

Смотрите иногда TextView сам пойти down.Any другие варианты, которые вы можете попробовать, чтобы избежать этого, вместо того, чтобы ваши решения, которые у вас есть?

PercentRelativeLayout

Любое дополнительное преимущество этого? Да, это поддерживает размеры и поля на основе процентов. У вас установлен фиксированный размер, и это даст вам их с использованием процента.У него даже есть классный атрибут: layout_aspectRatio. Вот ссылка для небольшого tutorial.

Give sizes based on ratio/absolute position of a view

Перед PercentRelativeLayout я в основном используется this.First вам нужно иметь модель изображения/эскиз вашего зрения. Моя модель с 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 в высоту, с этим я регулировать, что такое же отношение к моей смородиной экран (с использованием размера экрана смородины).

Возвращение к автоматическому масштабированию, так как теперь у нас одинаковое отношение, основанное на соотношении, вот еще один хороший ответ.

Auto-fit TextView for Android

андроид: textAppearance

Наконец, есть фиксированные размеры, приведенные в андроид \platforms\android-X\data\res\values\themes.xml на основе небольшой, крупных и средних.

без указания того, что вы точно нужны, чтобы вы также можете использовать его как

<TextView 
    android:textAppearance="?android:attr/textAppearance" 
    .... 
    /> 

Надеется, что это помогает!

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

Примечание: Она будет работать только на устройстве, а не на планшете. нам нужно написать другую логику для планшета. для этого вам нужно установить размер шрифта в dimen.xml

1

Я думаю, вы не должны исправлять 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)); 

После y ou сделать так, ваша проблема не произойдет