Как создать RelativeLayout программно с двумя кнопками одна поверх другой?
Я добавляю две кнопки в пользовательский интерфейс, но они появляются поверх друг друга. Я хочу, чтобы они появились рядом друг с другом. Что я пропустил в этом коде?
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);
3 ответа:
Я написал краткий пример, чтобы продемонстрировать, как создать макет программно.
В теории все должно быть ясно, как это комментируется. Если ты чего-то не понимаешь, просто скажи мне.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); } }
Нашел ответ в Как программно выложить представления в RelativeLayout?
Мы должны явно задать id, используя setId (). Только тогда, RIGHT_OF правила имеют смысл.
Еще одна ошибка, которую я сделал, это повторное использование объекта layoutparams между элементами управления. Мы должны создать новый объект для каждого элемента управления
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); } }