How to create a RelativeLayout programmatically with two buttons one on top of the other?

AndroidAndroid Relativelayout

Android Problem Overview


I'm adding two buttons to the UI, but they appear on top of one another. I want them to appear next to each other. What am I missing in this code?

m_btnCrown = new ImageButton(this);
m_btnCrown.setImageResource(R.drawable.king_crown_thumb);
m_btnCrown.setAlpha(100);

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
	RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);


addContentView(m_btnCrown, lp);


m_btnMonkey = new ImageButton(this);
m_btnMonkey.setImageResource(R.drawable.monkey_small);
m_btnMonkey.setAlpha(100);

lp = new RelativeLayout.LayoutParams(
	RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
lp.addRule(RelativeLayout.RIGHT_OF, m_btnCrown.getId());   

addContentView(m_btnMonkey, lp);

Android Solutions


Solution 1 - Android

I have written a quick example to demonstrate how to create a layout programmatically.

public class CodeLayout extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // Creating a new RelativeLayout
        RelativeLayout relativeLayout = new RelativeLayout(this);
        
        // Defining the RelativeLayout layout parameters.
        // In this case I want to fill its parent
        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
        		RelativeLayout.LayoutParams.FILL_PARENT,
        		RelativeLayout.LayoutParams.FILL_PARENT);
        
        // Creating a new TextView
        TextView tv = new TextView(this);
        tv.setText("Test");
        
        // Defining the layout parameters of the TextView
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
        		RelativeLayout.LayoutParams.WRAP_CONTENT,
        		RelativeLayout.LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
        
        // Setting the parameters on the TextView
        tv.setLayoutParams(lp);
        
        // Adding the TextView to the RelativeLayout as a child
        relativeLayout.addView(tv);
        
        // Setting the RelativeLayout as our content view
        setContentView(relativeLayout, rlp);
    }
}

In theory everything should be clear as it is commented. If you don't understand something just tell me.

Solution 2 - Android

Found the answer in https://stackoverflow.com/questions/2305395/laying-out-views-in-relativelayout-programmatically/2499721#2499721

We should explicitly set id's using setId(). Only then, RIGHT_OF rules make sense.

Another mistake I did is, reusing the layoutparams object between the controls. We should create new object for each control

Solution 3 - Android

public class AndroidWalkthroughApp1 extends Activity implements View.OnClickListener {
	
	final int TOP_ID = 3;
	final int BOTTOM_ID = 4;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // create two layouts to hold buttons
        RelativeLayout top = new RelativeLayout(this);
        top.setId(TOP_ID);
        RelativeLayout bottom = new RelativeLayout(this);
        bottom.setId(BOTTOM_ID);
        
        // create buttons in a loop
        for (int i = 0; i < 2; i++) {
        	Button button = new Button(this);
        	button.setText("Button " + i);
        	// R.id won't be generated for us, so we need to create one
        	button.setId(i);
        	
        	// add our event handler (less memory than an anonymous inner class)
        	button.setOnClickListener(this);
        	
        	// add generated button to view
        	if (i == 0) {
        		top.addView(button);
        	}
        	else {
        		bottom.addView(button);
        	}
        }

        RelativeLayout root = (RelativeLayout) findViewById(R.id.root_layout);
         
        // add generated layouts to root layout view
       // LinearLayout root = (LinearLayout)this.findViewById(R.id.root_layout);

        root.addView(top);
        root.addView(bottom);
    }
    
    @Override
	public void onClick(View v) {
		// show a message with the button's ID
		Toast toast = Toast.makeText(AndroidWalkthroughApp1.this, "You clicked button " + v.getId(), Toast.LENGTH_LONG);
		toast.show();
		
		// get the parent layout and remove the clicked button
		RelativeLayout parentLayout = (RelativeLayout)v.getParent();
		parentLayout.removeView(v);
		
		

	}
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKarthik MuruganView Question on Stackoverflow
Solution 1 - AndroidOctavian A. DamieanView Answer on Stackoverflow
Solution 2 - AndroidKarthik MuruganView Answer on Stackoverflow
Solution 3 - AndroidDurul DalkanatView Answer on Stackoverflow