Android:为所有屏幕调整UI组件大小的智能方法?

Android:为所有屏幕调整UI组件大小的智能方法?,android,Android,我一直很难找到一种通用的方法来调整UI组件的大小,使它们在所有设备上看起来都很好。我有一些想法,但可以利用任何反馈或更好的策略建议 以一个简单的情况为例,比如一个对话框中有一个编辑文本,用户将在其中输入一个相当长的字符串。在较小的设备上,我希望EditText尽可能宽(因为这些设备上可能的最大大小可能没有那么大)。但是,如果我将这个EditText的宽度设置为FILL_PARENT,那么这个对话框在平板电脑上看起来会很傻,因为它会比需要的宽很多很多。此外,将宽度设置为某个硬编码的DIP值(如50

我一直很难找到一种通用的方法来调整UI组件的大小,使它们在所有设备上看起来都很好。我有一些想法,但可以利用任何反馈或更好的策略建议

以一个简单的情况为例,比如一个对话框中有一个编辑文本,用户将在其中输入一个相当长的字符串。在较小的设备上,我希望EditText尽可能宽(因为这些设备上可能的最大大小可能没有那么大)。但是,如果我将这个EditText的宽度设置为FILL_PARENT,那么这个对话框在平板电脑上看起来会很傻,因为它会比需要的宽很多很多。此外,将宽度设置为某个硬编码的DIP值(如500)也不太好,因为它不会最大化较小设备上的可用空间,如果设备旋转,也不会扩展到占用额外空间,并且在小于500 DIP的设备上可能会出现问题

我想做的是通过硬编码EditText的宽度到屏幕宽度的一半来近似填充父对象的行为,但是通过不允许宽度大于某个DIP值(如500),防止EditText在大型设备上变宽

我在这个策略中遇到了两个问题:

1:如果我将EditText的宽度设置为屏幕的宽度,则EditText不适合屏幕(如下图所示)。我通过将宽度设置为屏幕宽度的90%来解决这个问题,但这是有问题的(如果设备的对话框周围有更大的边距怎么办?)

2:我的应用程序在其应用程序清单中设置了android:configChanges标志,这样对话框就不会在轮换时被取消。但这意味着对话框不会在旋转时调整大小。因此,如果在对话框可见时设备从横向旋转到纵向,则编辑文本对于屏幕来说太宽;如果方向相反,则EditText不会占用所有可用空间。我想这可以通过在旋转时中继我的对话框来解决,但我的活动必须跟踪可见对话框并强制它在旋转时重新播放(特别是因为在重新播放后,每个对话框都会重新填充任何字段值),这似乎很痛苦/难看

那么,有没有关于改进我的解决方案或其他选择的想法

class SampleDialog extends Dialog
{
    public SampleDialog(Context context) 
    {
        super(context);

        setContentView(getContentView());
    }

    private View getContentView()
    {

        TextView label = new TextView(getContext());
        label.setText("A label:");

        int fiveHundredDips = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 500, activity.getResources().getDisplayMetrics());
        Display display = getWindowManager().getDefaultDisplay();
        float width = .9f * display.getWidth();
        Math.min(width, fiveHundredDips);
        LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams((int) width, LinearLayout.LayoutParams.WRAP_CONTENT);

        EditText editText = new EditText(getContext());
        editText.setLayoutParams(linearParams);

        LinearLayout layout = new LinearLayout(getContext());
        layout.addView(label);
        layout.addView(editText);

        return layout;
    }
}

}

看看android:minWidth属性。它在TextView和其他网站上都可用。minWidth(使用dip单位设置)似乎是一个不错的选择。可以使文本框足够大,但不能太大

可以通过编程方式设置这些值。您可能还会发现以下代码在确定要为minWidth使用的值时很有用:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Log.d("density", metrics.density);
Log.d("width dip", (int) (metrics.widthPixels / metrics.density));
Log.d("height dip", (int) (metrics.heightPixels / metrics.density));

您可以在资源文件夹中使用不同的文件夹,这些文件夹为不同的设备定义不同的限定符。然后,您可以在小型设备上指定尺寸为“x”大,在平板电脑上指定尺寸为“x”大

另一个解决方案是通过编程检测设备是否为平板电脑,并基于此执行操作


我建议您研究资源限定符,它在Android中是一个非常强大的工具。

实际上,我想使用的是带有填充父项的maxWidth,这样我可以将EditText设置为填充父项的宽度,但确保它不超过某个maxWidth值。但是,当我尝试此操作时,EditText非常小(可能是EditText的最小可能大小),可能是因为当视图是对话框的子视图时,为视图设置FILL\u PARENT无效。此外,即使我强制对话框填充\u PARENT,以便我可以使用EditText的FILL\u PARENT,似乎忽略了MaxWidth(无论我对setMaxWidth()使用什么,EditText始终占据整个屏幕),这是一个好主意。执行以下操作:若设备是平板电脑,则将宽度设置为400英寸,否则使用填充。关于确定平板电脑合适的下倾宽度有什么建议吗?在eclipse布局设计器中测试您的布局?我能想到的最好的办法就是不要买一个闪亮的新标签:p