¿Cómo crear un RelativeLayout programáticamente con dos botones uno encima del otro?

Estoy agregando dos botones a la interfaz de usuario, pero aparecen uno encima del otro. Quiero que aparezcan uno al lado del otro. ¿Qué me estoy perdiendo en este código?

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

He escrito un ejemplo rápido para demostrar cómo crear un diseño mediante progtwigción.

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

En teoría, todo debe quedar claro a medida que se comenta. Si no entiendes algo solo dime.

¿Encontró la respuesta en Cómo diseñar Vistas en RelativeLayout programáticamente?

Deberíamos establecer explícitamente id’s usando setId (). Solo entonces, las reglas RIGHT_OF tienen sentido.

Otro error que cometí fue reutilizar el objeto layoutparams entre los controles. Deberíamos crear un nuevo objeto para cada control

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