1

クラスを拡張するカスタムクラスを取得しましたViewGroup。その中に、隣り合う必要がある2つのボタンを含むいくつかのビューを追加したいと思います。このビューで XML ファイルを作成し、addView を使用して追加するというアイデアを思いつきました。残念ながらうまくいきません。

私の 2 番目のアイデアは、2 つのボタンと共に LineraLayout をプログラムで作成し、すべての設定をセットアップしてから追加することでした。

これはコードです:

//adding view to view group
addView(createView(ctx));

//function creating linearlayout and buttons
private View createView(Context ctx){
        LinearLayout l = new LinearLayout(ctx);
        l.setOrientation(LinearLayout.HORIZONTAL);
        l.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        Button btnL = new Button(ctx);
        btnL.setText("Text1");
        Button btnR = new Button(ctx);
        btnR.setText("Text2");
        l.addView(btnL);
        l.addView(btnR);
        return l;
    }

問題は、このビューがまったく表示されないことです。これは、LinearLayout から作成されたものです。LogCat にエラーはありません。

誰かがそれを追加するために私がしなければならないことを教えてもらえますか?

編集:

これは のコードですonLayout。持っていませんonMeasure:

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int w = getWidth();
        int h = getHeight();
        for (int i = 0; i < NUM_CHILDREN; i++) {
            View v = getChildAt(i);
            int ii = i * 4;
            float fl = w * COORDS[ii] / GRID_WIDTH;
            float ft = h * COORDS[ii + 1] / GRID_HEIGHT;
            float fr = fl + w * COORDS[ii + 2] / GRID_WIDTH;
            float fb = ft + h * COORDS[ii + 3] / GRID_HEIGHT;
            v.layout(Math.round(fl), Math.round(ft), Math.round(fr),
                    Math.round(fb));
        }
    }

一般に、特定のビューの正確な寸法がどうあるべきかという情報を得た巨大なテーブルを使用しています。

4

2 に答える 2

4

次のように、カスタム ViewGroup の onMeasure() をオーバーライドします。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int w = getWidth();
    int h = getHeight();
    for (int i = 0; i < NUM_CHILDREN; i++) {
        View v = getChildAt(i);
        int ii = i * 4;
        float fw = w * COORDS[ii+2] / GRID_WIDTH;
        float fh = h * COORDS[ii+3] / GRID_HEIGHT;
        int wSpec = MeasureSpec.makeMeasureSpec(Math.round(fw), MeasureSpec.EXACTLY);
        int hSpec = MeasureSpec.makeMeasureSpec(Math.round(fh), MeasureSpec.EXACTLY);
        Log.d(TAG, "onMeasure Width " + MeasureSpec.toString(wSpec) + ", Height " + MeasureSpec.toString(hSpec));
        v.measure(wSpec, hSpec);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
于 2013-07-14T07:05:42.803 に答える