0

最初の Android プロジェクト (Helloworld の代わりに) として単純な電卓を作成したいのですが、calculaotr UI を以下に示します。これを使用GridLayoutして、結果表示TextViewとコントロールButtonsを配置し、 GridLayout6 行と 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 を構成することはできません。それにもかかわらず、いくつかの一般的なユースケースは、次のように対応できます。セル グループ内のコンポーネントの周囲に等量のスペースを配置する。中央揃え (または重力) を使用します。行または列の余分なスペースの配分を完全に制御するため。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" />

LinearLayoutまたは、たとえば、レンダリングに関してはかなり一貫性のある別のレイアウトを使用することもできます。

PS

ドキュメントから:

GridLayout に変更を通知するには、setLayoutParams(ViewGroup.LayoutParams) を呼び出す必要があります。

たぶん、レイアウト パラメータを変更した後、GridLayout.invalidate();?を呼び出す必要があります。

于 2013-08-03T14:51:02.823 に答える