检测布局中的第一个按钮

Detecting first button in layout

我正在尝试解决这个难题:"How to get rest of the buttons in a list go under the first button."

为了解决这个问题,我尝试设置一个布尔值来检测第一个按钮并将规则应用于它下面的任何内容,但是 button1 似乎每次都在 button0 之上。

我在下面列出了 MainActivity。布局 xml 只有一个相对布局。

public class MainActivity extends Activity implements View.OnClickListener {

private ArrayList<Category> categories = new ArrayList<Category>();
private ArrayList<Button> buttons = new ArrayList<Button>();
private boolean firstButton = true;

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

    RelativeLayout relLayout = (RelativeLayout) findViewById(R.id.mainLayout);

    categories.add(new Category("Mobility",CategoryTypes.MOBILITY));
    categories.add(new Category("Flexibility",CategoryTypes.FLEXIBILITY));
    categories.add(new Category("Mobility",CategoryTypes.MOBILITY));
    categories.add(new Category("Flexibility",CategoryTypes.FLEXIBILITY));
    categories.add(new Category("Mobility",CategoryTypes.MOBILITY));
    categories.add(new Category("Mobility",CategoryTypes.MOBILITY));

    for (int i = 0; i < 6; i++)
    {
        makeButton(this, "Buttons"+i,i);
    }

    for (int i = 0; i < buttons.size(); i++)
    {
        addButtonToLayout(buttons.get(i),relLayout,i);
        System.out.println(buttons.get(i).getLayoutParams());
    }
}

//This method constructs a button object, sets its text, id and an OnClickListener. Finally adds the buttons to buttons arraylist
void makeButton (Context context, String buttonText, int id)
{
    Button button = new Button(context);
    button.setText(buttonText);
    button.setId(id);
    button.setOnClickListener(this);

    buttons.add(button);
    System.out.println(button.getId());
}

//Method to add button to layout. The LayoutParams are used to add the rule that the buttons should be underneath each other.
void addButtonToLayout (Button button, RelativeLayout layout, int index)
{
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    RelativeLayout.LayoutParams paramsForSecondButton = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

    if (firstButton)
    {
        firstButton = false;
        System.out.println(buttons.get(index).getText());
        //TODO: [BUG] Doesn't add the first button for some reason.
    }
    else if (!firstButton)
    {
        params.addRule(RelativeLayout.BELOW, buttons.get(index-1).getId());
    }

    //paramsForSecondButton.addRule(RelativeLayout.BELOW, buttons.get(0).getId());

    //params.addRule(RelativeLayout.BELOW, buttons.get(index).getId());
    button.setLayoutParams(params);
   // buttons.get(1).setLayoutParams(paramsForSecondButton);

    layout.addView(button);
}

这是布局的图片:

有一个 类似的问题应该对您有所帮助。

The reason this is failing for you is because of the IDs you are using. Android uses "reserved" ids for things like the general content area of the app.

Using your code, I was able to add 1000 to each ID and generate the intended result.

另外,以这种方式放置按钮也不是一个好主意。除非你有理由这样做,否则一个简单的 LinearLayout 将以一半的计算时间完成这项工作。

这种情况你试过吗:

if (firstButton)
{         
    firstButton = false;
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
}
else if (!firstButton)
{
    params.addRule(RelativeLayout.BELOW, buttons.get(index-1).getId());
}