TextView在某些分辨率下被削减

时间:2017-02-01 13:41:16

标签: android android-layout android-recyclerview android-xml

我有一个RecyclerView,其中CardView包含TextViewImageView,以及其他一些布局。
问题是,在某些屏幕分辨率下,TextView会被切断或推到下一行,这是我不想要的。
在其他决议中,TextView有足够的空间。

小决议:
Small

高分辨率:
enter image description here

如何整理布局,以便TextView有足够的空间,ImageView的大小会相应调整?

这是RecyclerView项目的xml:

<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 个答案:

答案 0 :(得分:10)

试试这个。 100%工作。

AutoResizeTextView sdp单位可以为您提供帮助。

SDP - 可扩展的尺寸单位

提供新尺寸单元的Android SDK - sdp 可扩展的dp )。此尺寸单位随屏幕尺寸而变化。它可以帮助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

更多信息请查看here

答案 1 :(得分:3)

enter image description here

TextView 自动调整文本大小以完全适合其范围

用法:

dependencies {
    compile 'me.grantland:autofittextview:0.2.+'
}

在代码中启用任何View扩展TextView:

AutofitHelper.create(textView);

启用任何以XML格式扩展TextView的View:

<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中使用内置的Widget:

<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 :(得分:3)

我可以为您的文字大小建议两步解决方案一,所以使用wrap_content属性它适合文本,我建议使用限定符提供几种替代布局来定位不同的屏幕配置。您可以使用配置限定符来执行此操作,该限定符允许运行时根据当前设备的配置自动选择适当的资源(例如针对不同屏幕大小的不同布局设计)。 Supporting Different Screen Sizes

从这一部分直到最后我从this link复制了@ Herry的回答: 我想你需要查看Google IO Pdf for Design。在那个pdf中转到 Page No:77 ,在其中你会发现如何建议使用dimens.xml用于不同的android设备,例如见下面的结构:

  

RES /值/ dimens.xml

     

RES /值小/ dimens.xml

     

RES /值正常/ dimens.xml

     

RES /值-大/ dimens.xml

     

RES /值-XLARGE / dimens.xml

例如,您在values中使用了以下的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>

答案 3 :(得分:2)

如果您想要可扩展的屏幕,则不应尽可能使用固定的高度或宽度。在您的情况下,您应该使用layout_weight按比例放置组件。

了解更多详情;

What does android:layout_weight mean?

答案 4 :(得分:2)

更简单的方法是使用相对布局创建您的布局,并使用一些适当的技术确保它将解决。如果还有问题请问我.xml文件

答案 5 :(得分: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" />

答案 6 :(得分:2)

在这里,您再次使用关键词

再次访问

分辨率

您现在有哪些选择?

只是总结了那些答案(一体机)!还有其他选择吗?

我可以看到你的问题与两个手拉手的情况有关。

  1. 当然,您的文字不会调整大小2.您的布局太灵活了。

    enter image description here

  2. 有时看到TextView本身就会崩溃。您可以尝试避免使用其他任何选项,而不是您的解决方案吗?

    PercentRelativeLayout

    这有什么额外的好处吗?是的,这支持基于百分比的维度和边距,您已设置固定边距,这将使用百分比给它们。它甚至有一个名为layout_aspectRatio的酷属性。这是一个小tutorial的链接。

    Give sizes based on ratio / absolute position of a view

    PercentRelativeLayout之前我主要使用这个。首先,您需要有一个模型图像/草图。 我的模型高度为1920像素,宽度为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

    最后,基于小型,大型和中型的android \platforms\android-X\data\res\values\themes.xml中给出了固定大小。

    如果没有指定您的确切需要,您也可以将其用作

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

    希望这有帮助!

答案 7 :(得分:1)

尝试为textview布局赋予权重,并且imageview布局为两个布局赋予权重1

答案 8 :(得分:1)

使用AutoScaleTextView

AutoScaleTextView获取android:textSize值并将其用作首选文本大小。您还可以设置最小文本大小。最小文本大小的默认值为10dpAutoScaleTextView现在尝试获取适合视图宽度的首选大小和最小大小之间的最大值(关于填充)。

请在下面的LINK中找到完整的AutoScaleTextView类及其实现

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

答案 9 :(得分: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中设置字体大小

答案 10 :(得分:1)

我认为您不应该修复spanCount的{​​{1}}。最好是GridLayout你会显示4个项目,high resolutions你显示3个项目,small resolutions 5项,...

要做到这一点,你应该为你支持的所有值文件夹创建一个landscape display,如

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

在您这样做之后,您的问题将不会发生

答案 11 :(得分:0)

我在android中的经验我总是使用dp而不是sp,所以你修复所有textview的dp值并适合屏幕。

如果有任何问题,请告诉我。

Best Regds