Search code examples
javaandroidandroid-layoutandroid-studioandroid-relativelayout

Detecting first button in layout


I am trying to solve this conundrum: "How to get rest of the buttons in a list go under the first button."

In order to solve that issue, I have tried to set a boolean to detect the first button and apply the rule on anything below that, but button1 seems to go on top of button0 every time.

I listed the MainActivity below. The layout xml only has a Relative layout in it.

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);
}

Here is an image of the layout: image of layout


Solution

  • There is an answer to similar question that should help you.

    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.

    Also it is not a good idea to position your buttons in such way. Unless you have reasons for this a simle LinearLayout will do the job at half the price of computational time.