2

グリッド ビュー 4x4 内にボタンがある電卓を設計しようとしています。ビューを生成すると、グリッドの下に空白ができます。グリッドで親を完全に埋めたい。http://rechner-app.com/の例のように。これを行う方法。

activity_main.xml

<TextView
    android:id="@+id/txtStack"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5sp"
    android:layout_marginRight="5sp"
    android:layout_marginTop="3sp"
    android:gravity="right"
    android:textSize="15sp" />

<TextView
    android:id="@+id/txtInput"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5sp"
    android:layout_marginRight="5sp"
    android:gravity="right"
    android:textSize="25sp" />

<TextView
    android:id="@+id/txtMemory"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5sp"
    android:layout_marginRight="5sp"
    android:gravity="left"
    android:textSize="15sp" />

<LinearLayout
    android:id="@+id/gridContainer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="fill_horizontal"
    android:orientation="vertical" >
    <GridView
        android:id="@+id/grdButtons"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:horizontalSpacing="0.5dp"
        android:numColumns="4"
        android:stretchMode="columnWidth"
        android:verticalSpacing="0.5dp" />
</LinearLayout>

アダプタ。

public View getView(int position, View convertView, ViewGroup parent) {
    Button btn;
    if (convertView == null) { // if it's not recycled, initialize some
                                // attributes

        btn = new Button(mContext);
        KeypadButton keypadButton = mButtons[position];

        btn.setBackgroundResource(R.drawable.keypad1);

        // Set OnClickListener of the button to mOnButtonClick
        if (keypadButton != KeypadButton.DUMMY)
            btn.setOnClickListener(mOnButtonClick);
        else
            btn.setClickable(false);
        // Set CalculatorButton enumeration as tag of the button so that we
        // will use this information from our main view to identify what to
        // do
        btn.setTag(keypadButton);
        View rootView = LayoutInflater.from(mContext).inflate(R.layout.activity_main, parent, false);
        GridView mKeypadGridContainer = (GridView) rootView.findViewById(R.id.grdButtons);
        Log.d(TAG, mKeypadGridContainer.getHeight() + "sadsd");
        Log.d(TAG, mKeypadGridContainer.getHeight() + " :height");
        //btn.setMinimumHeight(MainActivity.metricsHeight/4);
    } else {
        btn = (Button) convertView;
    }

    btn.setText(mButtons[position].getText());
    return btn;
}
4

3 に答える 3

1

public class ResizeableGridView extends GridView {

private int height;

public ResizeableGridView(Context context) {
    super(context);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     height = getHeight();
}

@Override
protected void layoutChildren() {
    super.layoutChildren();
    View v = getChildAt(0);
    if((v.getHeight()*5) < height){
        //if the combined height of rows is less than parent then only resize the children to fit parent
        int count = getChildCount();
        for(int i = 0;i < count;i++){
            View view = getChildAt(i);
            ViewGroup.LayoutParams params = view.getLayoutParams();
            //I am using 5 because i used it for calendar and it has exactly five rows
            params.height = height/5;
            view.setLayoutParams(params);
        }//end for
    }//end if
 } // end layoutChildren
} //end GridView
于 2013-11-21T06:29:01.477 に答える
1

カスタム複合コントロールが必要になります。ここで私の答えを見てください:

ネストされたウェイトなしで、通常のサイズ変更可能なグリッドを作成する方法は?

アップデート

これは素晴らしいチュートリアルのようです:

http://blog.tomgibara.com/post/1696552527/implement-your-own-android-layouts

必要に応じて変更する必要があり、onMeasure と onLayout がどのように機能するかを理解する必要がありますが、一度理解すれば、すべてがうまく収まり、簡単です。

そのようなコントロールを構築しなければならないプロジェクトがありました。よく覚えていれば、MeasureSpec クラスを使用して親の onMeasure() メソッドで最初に measure() メソッドで子の onMeasure メソッドを呼び出し、次に getMeasuresWidth() と -Height を使用して親の onLayout() で結果を使用しました。 () メソッド。測定された寸法が含まれていました。一言で言えば、それはすべてです。

于 2013-06-12T09:34:09.990 に答える