如何使我的android组件与各种显示屏尺寸相关?

如何使我的android组件与各种显示屏尺寸相关?,android,android-widget,size,screen,Android,Android Widget,Size,Screen,我正在制作一个android组件,允许用户从中选择日期。对于希望用户在其应用程序中选择日期的开发人员来说,这很有帮助。在我的基本视图中,我有文本视图,其中来自弹出窗口的日期将填充到其中,并且在文本视图旁边有一个按钮。当用户单击按钮时,我的组件弹出并显示日期。该组件在弹出窗口中弹出,并以月视图的形式显示日期,用户还可以从下一个月切换到上一个月,就像我们在日历中所做的那样。检查图像 (很抱歉,我无法在此上载图像,因为我是这里的新用户,因此不允许我在此上载图像) 每个日期都是一个文本视图,宽度为35,

我正在制作一个android组件,允许用户从中选择日期。对于希望用户在其应用程序中选择日期的开发人员来说,这很有帮助。在我的基本视图中,我有文本视图,其中来自弹出窗口的日期将填充到其中,并且在文本视图旁边有一个按钮。当用户单击按钮时,我的组件弹出并显示日期。该组件在弹出窗口中弹出,并以月视图的形式显示日期,用户还可以从下一个月切换到上一个月,就像我们在日历中所做的那样。检查图像

(很抱歉,我无法在此上载图像,因为我是这里的新用户,因此不允许我在此上载图像)


每个日期都是一个文本视图,宽度为35,高度为30,由我设置。DaysDisplayBar也是我设置的一些大小。所以这个组件的整个宽度是245,高度大约是200。这是手机屏幕尺寸

我想使这个组件的大小取决于各种屏幕显示大小。例如,如果在平板电脑或平板电脑上观看,则其尺寸应大于手机屏幕上的尺寸。也就是说,对于各种显示器,其大小应更改为某个值,如显示器大小的最大1/3或类似值

解决这个问题的办法是什么?据我所知,这里需要一些数学,一些公式,方程等。抛物线怎么样?请帮帮我,我的数学完全不懂。谢谢D

“每个日期都是一个文本视图,宽度为35,高度为30,由我设置。DaysDisplayBar也是由我设置的一些大小。因此该组件的整个宽度为245,高度约为200。这是用于移动屏幕大小。”

^^这就是问题所在。尺寸应相对于布局定义,而不是绝对尺寸。例如,日历有7列(每天一列)。不要把每一个都做成35像素,而是把屏幕的每七分之一都做成

因此:

我假设
DaysDisplayBar
是一行,包含7个
textview
(每天一个)。如果这是真的,为什么不称之为
?无论哪种方式,诀窍都在于
布局。使所有元素
填充父元素
,并且所有元素都具有相同的权重1。这将均匀地分布父元素中的所有元素。在您的情况下,父项是一个
DaysDisplayBar

因此:

设置
DaysDisplayBar
属性'layout\u width=“fill\u parent”

对于每个
TextView
设置属性
layout\u width=“fill\u parent”和
layout\u weight=“1”`


希望有帮助

首先,确保使用密度像素(dip)而不是像素。 第二,你可以得到屏幕的宽度和高度,然后从那里计算你的组件大小

您可以使用
Display
class
getSize()
方法获取屏幕尺寸:

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point screenSize = new Point();
display.getSize(screenSize);
int screenWith = screenSize.x;
或者,您可以获取父视图尺寸:

MarginLayoutParams params = (MarginLayoutParams)parentView.getLayoutParams();
int padding = parentView.getPaddingLeft() + parentView.getPaddingRight();
int margin = params.leftMargin + params.rightMargin;
int measuredWidth = parentView.getMeasuredWidth() - padding - margin;
这样,您就可以知道组件的父视图元素中有多少空间。 请记住,要将任何硬编码值转换为dip,可以通过以下方式执行:

public static int getDensitySize(float size) {
    float density = getResources().getDisplayMetrics().density;
    return (int)(density * size);
}

您可以通过
onMeasure
方法来设置视图大小,然后在
onDraw
上使用此度量来绘制组件。

远高于弹出窗口大小的大小适用于分辨率为480 x 854的手机。对于平板电脑或平板电脑的分辨率,它应该自动变得更大,对于谷歌电视等,它应该变得更大。那个么我该怎么做呢?希望你明白我的问题!谢谢:)您将每个文本视图的宽度设置为35,高度设置为30。我已经创建了DateView作为一个扩展TextView的类。在DateView中,
this.setHeight(30)
此.setWidth(35)之后,在我的日历类中,我编写了
DateView dtView=newdateview(this.getContext())
这些被添加到TableRow中,然后那个TableRow被添加到TableLayout中。你只关注这个文本视图,顺便说一下,我在这个TableLayout和一些其他视图周围有一些按钮,我不能在图像中显示。因此,我不希望采用先检查屏幕大小的方法,如果为真,然后设置文本视图和其他视图的大小xxx或屏幕大小yyy set zzz。我希望这是自动的,我认为这可以通过一些等式来实现,不能得到……好的,然后将
layout\u wieght=1
layout\u width=“fill\u parent”
应用到水平通道上的每个元素。这将使用匹配的
布局\u wieght
均匀缩放每个元素。没有代码示例是很困难的,但是修复方法是诚实地使用
layout\u wieght
谢谢!我知道获取屏幕大小是解决方案之一,我可以使用高度和宽度变量,组件的大小取决于这些变量。但对于这一点,我需要一些方程,它将输入作为屏幕高度和宽度,将做一些计算,并将提供我自己的组件的高度和宽度。从更小的屏幕到更大的屏幕,组件大小将逐渐增加,但在某个时期,虽然屏幕大小变大,但组件大小将保持不变,就像抛物线图一样。希望你能理解我想说的…你想要的是把你的组件放大到一定的尺寸,对吗?如果是这样的话,很简单,你可以将组件比例设置为屏幕大小的1/3。但在一个大屏幕上,这是太多了,所以你设置了一个限制,硬编码,比如300dip。这样,如果你在大屏幕上显示你的组件,它将有300度的witdh,而不是1/3。好的,很酷,很好,也是这样。谢谢但看看抛物线图,当x增加时,抛物线的曲线也会增加,一段时间后,曲线和x轴几乎是平行的。我想在这里应用相同的概念,对于小屏幕,组件大小会改变,但对于大屏幕,它会稍微改变或者保持不变。像这样的东西你能看出来吗?一