我有一个RecyclerView
,其中CardView
包含TextView
和ImageView
,以及其他一些布局。
问题是,在某些屏幕分辨率下,TextView
会被切断或推到下一行,这是我不想要的。
在其他决议中,TextView
有足够的空间。
如何整理布局,以便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>
答案 0 :(得分:10)
试试这个。 100%工作。
AutoResizeTextView 或sdp单位可以为您提供帮助。
SDP - 可扩展的尺寸单位
提供新尺寸单元的Android SDK - sdp (可扩展的dp )。此尺寸单位随屏幕尺寸而变化。它可以帮助Android开发人员支持多个屏幕。
对于文本视图,请参阅ssp,它基于文本的sp大小单位。
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)
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"
/>
答案 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按比例放置组件。
了解更多详情;
答案 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.多维
Famous Answer on this particular question (Auto Scale Text-view Text to Fit within Bounds)
只是总结了那些答案(一体机)!还有其他选择吗?
我可以看到你的问题与两个手拉手的情况有关。
当然,您的文字不会调整大小2.您的布局太灵活了。
有时看到TextView
本身就会崩溃。您可以尝试避免使用其他任何选项,而不是您的解决方案吗?
这有什么额外的好处吗?是的,这支持基于百分比的维度和边距,您已设置固定边距,这将使用百分比给它们。它甚至有一个名为layout_aspectRatio
的酷属性。这是一个小tutorial的链接。
Give sizes based on ratio / absolute position of a view
在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高度,我正在调整我的卷曲屏幕的相同比例。(使用卷曲屏幕尺寸)。
回到自动缩放,因为现在我们有一个相同的基于比率的视图,这是另一个好的答案。
<强>机器人: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
值并将其用作首选文本大小。您还可以设置最小文本大小。最小文本大小的默认值为10dp
。 AutoScaleTextView
现在尝试获取适合视图宽度的首选大小和最小大小之间的最大值(关于填充)。
请在下面的LINK中找到完整的AutoScaleTextView类及其实现
答案 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