如何创build一个RelativeLayout程序化的两个button一个在另一个之上?

我在UI中添加了两个button,但它们显示在另一个上面。 我希望他们出现在彼此旁边。 我在这段代码中错过了什么?

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

我写了一个快速示例来演示如何以编程方式创build布局。

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

从理论上讲,每件事情都应该清楚,因为它是评论。 如果你不明白,就告诉我。

find答案如何以编程方式在RelativeLayout布局视图?

我们应该使用setId()明确地设置id。 只有这样,RIGHT_OF规则才有意义。

我做的另一个错误是,重用控件之间的layoutparams对象。 我们应该为每个控件创build新的对象

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