3

我想在我的应用程序中实现的事情是动态创建一组具有不同文本大小的按钮,然后将这些视图对齐到线性布局中。这是我想要实现的示例:

图片. 根据我希望按钮在一行中对齐的文本大小,如果最后一个按钮大于屏幕尺寸,它应该正确地转到下一行。

任何建议我该如何实现这一点或我应该寻找什么,因为我知道如果我尝试button.getWidth();它会返回 0 并且它不会工作。

感谢您的任何建议!

编辑

为此,您可以使用 Google 开源的新布局,称为:FlexboxLayout。您可以在Android 开发者博客的这篇文章中了解更多信息。

4

4 回答 4

2

感谢@Kameswari 的代码,它给了我正确的方向,我通过使用:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(5, 5, 5, 5);

String[] mKeywordsArray = mKeywords.split(", ");
if(mKeywordsArray != null){

    LinearLayout mNewLayout = new LinearLayout(getActivity()); // Horizontal layout which I am using to add my buttons.
    mNewLayout.setOrientation(LinearLayout.HORIZONTAL);
    int mButtonsSize = 0;
    Rect bounds = new Rect();

    for(int i = 0; i < mKeywordsArray.length; i++){

        String mButtonTitle = mKeywordsArray[i];
        Button mBtn = new Button(getActivity());
        mBtn.setPadding(10, 3, 10, 3);
        mBtn.setText(mButtonTitle);

        Paint textPaint = mBtn.getPaint();
        textPaint.getTextBounds(mButtonTitle, 0, mButtonTitle.length(), bounds);
            // size of all buttons in current horizontal layout
            // i am using +45 because of extra padding which is set in xml for this layout
        mButtonsSize += ( bounds.width() + 45);
        if(mButtonsSize < (mScreenWidth - 32)){ // -32 because of extra padding in main layout.
            mNewLayout.addView(mBtn, params);
        } else {
            mButtonsLayout.addView(mNewLayout);
            mNewLayout = new LinearLayout(getActivity());
            mNewLayout.setOrientation(LinearLayout.HORIZONTAL);
            mButtonsSize = bounds.width();
            mNewLayout.addView(mBtn, params); // add button to a new layout so it won't be stretched because of it's width.
        }

    }

    mButtonsLayout.addView(mNewLayout); // add the last layout/ button.
}
于 2013-04-12T12:00:54.663 回答
1

您可以尝试以下在添加按钮时,您可以计算占用的宽度为

occupiedWidth = button1Width + button2Width + ...

每个按钮宽度 = textWidth + 2*margin + 2*padding

你可以得到你放在按钮上的文本的宽度,比如

String buttonText = "<Your Button Text>"
paint.getTextBounds(buttonText, 0, buttonText.length(), bounds);
int textWidth = bounds.width();

将此新按钮的边距和填充添加为

int newWidth = textWidth + buttonMargin*2 + buttonPadding*2;

如果总宽度超过屏幕宽度,则移动到下一行。

于 2013-04-12T09:15:08.050 回答
0

据我说,你有两个选择:

1)采取方向linear layouthorizontal并继续以编程方式向此布局添加按钮。如果按钮的宽度无法适应该行,它将自动转到线性布局的下一行。

ViewGroup linearLayout = (ViewGroup) findViewById(R.id.linearLayoutID);

Button bt = new Button(this);
bt.setText("A Button");
bt.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
linerLayout.addView(bt);

2)您可以计算@kameswari提到的每个按钮的x,y位置并在x,y位置绘制相应的按钮

Button button = (Button)findViewById(R.id.button);// or new Button(this);
AbsoluteLayout.LayoutParams absParams = 
    (AbsoluteLayout.LayoutParams)button.getLayoutParams();
absParams.x = X;
absParams.y = Y;
button.setLayoutParams(absParams);
于 2013-04-12T10:36:13.397 回答
0
u can try this `enter code here`

 LinearLayout.LayoutParams leftMarginParams = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        leftMarginParams.leftMargin = 50;

        Button btn1 = new Button(this);
        btn1.setText("Button1");
        linLayout.addView(btn1, leftMarginParams)
于 2014-09-03T11:57:19.480 回答