0

我想创建一个简单的计算器作为我的第一个 android 项目(而不是 Helloworld),calculaotr UI 如下所示,我用它GridLayout来排列结果显示TextView和控件ButtonGridLayout需要 6 行和 4 列。(我在这里简化了xml布局文件)

<GridLayout android:rowCount="6" 
            android:columnCount="4"
            android:orientation="horizontal">
    <TextView android:id="@+id/expressionTextView"
              android:layout_columnSpan="4"/>
    <LinearLayout
              android:layout_columnSpan="4">
        <Button android:id="@+id/btnClearText"/>
        <Button android:id="@+id/btnDeleteText"/>
    </LinearLayout>
 <GridLayout>

在此处输入图像描述

为了创建+/-/x//0-9.按钮,我使用以下代码:

String[] buttonTexts = new String[] 
{
    "7", "8", "9", "/",
    "4", "5", "6", "x",
    "1", "2", "3", "-",
    ".", "0", "=", "+"
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Point size = new Point();
    getWindowManager().getDefaultDisplay().getSize(size);
    int screenWidth = size.x;
    int screenHeight = size.y;
    int oneQuarterWidth = (int) (screenWidth * 0.25);

    for (int ii = 0; ii < buttonTexts.length; ii++) {
        Button btn = new Button(this);
        btn.setText(buttonTexts[ii]);
        btn.setTextSize(40);

        GridLayout.Spec rowSpec = GridLayout.spec(ii/4 + 2);
        GridLayout.Spec columnSpec = GridLayout.spec(ii % 4 );
        GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpec, columnSpec);
        params.setGravity(Gravity.FILL);
        params.width = oneQuarterWidth;
        gridLayout.addView(btn, params);
    }

但是,最后一行在垂直方向上延伸,在我的android机器上运行计算器时,最后一行可能会隐藏一些!

我想要的是使 UI 适合设备高度,您有什么想法吗?谢谢!

PS我什至尝试设置结果显示的高度,TextView其中LinearLayout包含Clear/Del使用:

expressionTextView = (TextView)findViewById(R.id.expressionTextView);
clearDelLinearLayout = (LinearLayout)findViewById(R.id.linearLayout1);

GridLayout.LayoutParams expressionTextViewParams =
     (GridLayout.LayoutParams)expressionTextView.getLayoutParams();
expressionTextViewParams.height = ...; // some calculated height
expressionTextView.setLayoutParams(expressionTextViewParams);

但这不起作用:(

4

1 回答 1

0

来自文档:

限制:

GridLayout 不提供对权重原则的支持,如权重中定义的那样。通常,因此不可能配置 GridLayout 来在多个组件之间分配多余的空间。尽管如此,一些常见的用例仍可按如下方式进行调整。在单元组中的组件周围放置等量的空间;使用 CENTER 对齐(或重力)。用于完全控制行或列中多余的空间分布;使用 LinearLayout 子视图将组件保存在关联的单元组中。当使用这些技术中的任何一种时,请记住,单元组可能被定义为重叠。

资源

尝试为孩子使用 LinearLayouts,例如:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" android:orientation="horizontal">
<Space
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1" />
<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnClearText" />

或者您可以简单地使用另一个布局,例如 eg LinearLayout,这在渲染方面非常一致

附言

来自文档:

必须调用 setLayoutParams(ViewGroup.LayoutParams) 以通知 GridLayout 更改

也许在更改布局参数后,您应该调用GridLayout.invalidate();?

于 2013-08-03T14:51:02.823 回答