我正在开发一个关于android version2.2的程序。我已经阅读了很多关于支持多种屏幕尺寸的文档但仍然感到困惑我设计了一个支持大屏幕和普通屏幕的布局文件,当我尝试使用小屏幕时,它不会调整布局以适应屏幕。我也在清单中使用了这段代码。
<supports-screens
android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>
小屏幕的图片为here. 如何设置与小屏幕兼容的屏幕?我通过使用文件夹“layout-small”找到的某个地方,但是如果我使用它,项目大小正在增加,我不希望这样,所以任何人都可以建议我这样做的最好方法吗?
答案 0 :(得分:32)
所有屏幕的解决方案并支持所有布局。
<强>图标强>
mdpi hdpi xhdpi xxhdpi xxxhdpi
Launcher Icons (App Icons) 48 x 48 72 x 72 96 x 96 144 x 144 192 x 192
Action Bar,Toolbar,Tab Icons 24 x 24 36 x 36 48 x 48 72 x 72 96 x 96
Notification Icons 24 x 24 36 x 36 48 x 48 72 x 72 96 x 96
背景图片解析:
ldpi: Portrait: 240 X 320px. Landscape: 320 X 240px.
mdpi: Portrait: 320 X 480px. Landscape: 480 X 320px.
hdpi: Portrait: 480 X 800px. Landscape: 800 X 480px.
xhdpi: Portrait: 640 X 960px. Landscape: 960 X 640px.
xxhdpi: Portrait: 960 X 1600px. Landscape: 1600 X 960px.
xxxhdpi: Portrait: 1280 X 1920px. Landscape: 1920 X 1280px.
可绘制文件夹:
res/drawable (default)
res/drawable-ldpi/ (240x320 and nearer resolution)
res/drawable-mdpi/ (320x480 and nearer resolution)
res/drawable-hdpi/ (480x800, 540x960 and nearer resolution)
res/drawable-xhdpi/ (720x1280 - Samsung S3, Micromax Canvas HD etc)
res/drawable-xxhdpi/ (1080x1920 - Samsung S4, HTC one, Nexus 5, etc)
res/drawable-xxxhdpi/ (1440X2560 - Nexus 6,Samsung S6edge).
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi
<强>布局:强>
Portrait:
res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-large/main_activity.xml # For small tablets (640dp x 480dp and bigger)
res/layout-xlarge/main_activity.xml # For large tablets (960dp x 720dp and bigger)
res/layout-w600dp/main_activity.xml # For 7” tablets or any screen with 600dp
# available width (possibly landscape handsets)
Landscape:
res/layout-land/main_activity.xml # For handsets in landscape
res/layout-sw600dp-land/main_activity.xml # For 7” tablets in landscape
参考链接:
Different resolution support android
https://developer.android.com/guide/practices/screens_support.html
https://design.google.com/devices/
Is there a list of screen resolutions for all Android based phones and tablets?
答案 1 :(得分:18)
请浏览以下链接。这些可能会对您有所帮助:
Supporting Different Screen Sizes
Supporting Different Densities
Supporting Tablets and Handsets
AFAIK,支持所有屏幕的唯一方法是通过执行该文件夹分叉。每个XML文件都高达几千字节。因此,尺寸不应该是一个问题。
答案 2 :(得分:9)
是的,我对你的问题有了治愈,你说得对,我个人认为为每个屏幕分辨率制作布局都需要花时间,让你的项目规模变大。
为了制作适合所有屏幕分辨率的布局,我实施了自己的技术,即以百分比设置宽度和高度
问题在我们将Views/Layouts
设置为常量宽度或高度时,会发生100dp
。
解决方案非常简单,尝试使用match_parent
,以便视图填满空白区域或使用weight
并定义相对于其他View
的每个Views
1}}这将有助于您的布局在几乎所有屏幕分辨率下都能看起来很好,并且在运行时设置LayoutParams
只有Views/Layouts
的宽或高度,百分比。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/mLayout"
android:layout_width="280px"
android:layout_height="300px" />
</RelativeLayout>
注意:我已将 px 用于固定大小的布局宽度/高度,因为在LayoutParams layoutParams = new LayoutParams(int width, int height);
width
height
并final ViewTreeObserver mLayoutObserver = mLayout.getViewTreeObserver();
mLayoutObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
DisplayMetrics metrics = getResources().getDisplayMetrics();
int deviceWidth = metrics.widthPixels;
int deviceHeight = metrics.heightPixels;
float widthInPercentage = ( (float) 280 / 320 ) * 100; // 280 is the width of my LinearLayout and 320 is device screen width as i know my current device resolution are 320 x 480 so i'm calculating how much space (in percentage my layout is covering so that it should cover same area (in percentage) on any other device having different resolution
float heightInPercentage = ( (float) 300 / 480 ) * 100; // same procedure 300 is the height of the LinearLayout and i'm converting it into percentage
int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 );
int mLayoutHeight = (int) ( (heightInPercentage * deviceHeight) / 100 );
LayoutParams layoutParams = new LayoutParams(mLayoutWidth, mLayoutHeight);
mLayout.setLayoutParams(layoutParams);
}
});
取值像素
这是一个示例代码
Views/Layouts
我想如果任何人仍然需要帮助你可以立即提出代码,那么代码几乎是自我解释
结论:如果您需要为布局中 px 中的LayoutParams
始终设置值设置一些常量宽度/高度 file(即xml)然后以编程方式设置dp/dip
。
建议:我认为 Google Android Guys 应该认真考虑将percentage
单位替换为{{1}}。
答案 3 :(得分:1)
现在支持不同的屏幕尺寸更容易!使用新尺寸单位 SDP 。
SDP - 可扩展的尺寸单位
提供新大小单元的android SDK - sdp(可扩展dp)。此尺寸单位随屏幕尺寸而变化。它可以帮助Android开发人员支持多个屏幕。
对于文本视图,请参阅ssp,它基于文本的sp大小单位。
答案 4 :(得分:0)
可扩展DP(sdp)是最好的解决方案。它将根据屏幕尺寸调整窗口小部件的大小。我们也可以将其应用于不同大小的文本。
要将sdp添加到您的项目中(使用Android Studio和Gradle):
将实现“ com.intuit.sdp:sdp-android:1.0.5 ”添加到build.gradle依赖项块中。
for example:
dependencies {'com.intuit.sdp:sdp-android:1.0.5' }
答案 5 :(得分:0)
尝试这个
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/myimage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
答案 6 :(得分:0)
尝试这个库很棒
implementation 'com.intuit.ssp:ssp-android:1.0.6'
示例
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign up"
android:textSize="@dimen/_16ssp" />
答案 7 :(得分:-1)
我不确定解决方案,但我希望与您分享,它可以在任何地方使用,它涵盖了大部分区域。
我通过使用LinearLayout
对屏幕进行分区并定义其方向(水平或垂直),layout_weightsum = 3
(3将屏幕划分为3个部分)来解决此问题。
然后在Root Linear布局中,我再次将LinearLayout
与layout_height = "0dp"
一起使用(如果您只想要垂直分区layout_height = "wrap_content"
,如果您需要水平,则生成layout_width = "0dp"
并且layout_weight =1
(1表示屏幕的一部分,您也可以将值放在浮动状态,如1.2)。
可以尝试这对我有所帮助,也许希望对你有帮助。
答案 8 :(得分:-1)
尝试使用layout_weight他们会有所帮助。 :)