Android: Центральные кнопки horiz. и vert. в ViewGroup

#android

#Android

Вопрос:

Я хочу центрировать группу кнопок по горизонтали и вертикали на дисплее.

Это то, что у меня есть сейчас:

Пользовательский RelativeLayout:

 RelativeLayout xml_layout = (RelativeLayout) findViewById(R.id.custom_layout_id);
  

Я создаю кнопки программно и добавляю их в xml_layout:

     
xml_layout.addView(ib[i], lp);
  

Я думаю, что вместо этого я должен использовать ViewGroup, а затем добавить свои кнопки
для ViewGroup добавьте правила для центрирования ViewGroup
а затем добавьте ViewGroup в мой RelativeLayout.

Я пробовал это

 
ViewGroup vg;
vg.addView(ib[i], lp); //The local variable vg may not have been initialized
  

и это

 
ViewGroup vg = null;
vg.addView(ib[i], lp); //Runtime Error
  

Но это не работает.

Я новая теория:

  1. Создайте ViewGroup
  2. Добавьте мои кнопки в группу просмотра
  3. Добавьте ViewGroup в RelativeLayout
  4. Добавьте правила в ViewGroup, чтобы центрировать ее по горизонтали
    и вертикали относительно RelativeLayout (переменная lp)

Но не знаю практики. Кто-нибудь может мне помочь?

Ответ №1:

Возможно, это наводит вас на мысль:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:layout_gravity="center"
    android:weightSum="5">
    <Button
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="ABC" />
    <Button
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="DEFG" />
    <Button
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="HI" />
    <Button
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="J" />
</LinearLayout>  

Ответ №2:

Если вы хотите, чтобы кнопки как группа были центрированы, вам нужно добавить их в LinearLayout вместо RelativeLayout. Тогда вы можете использовать одни и те же параметры макета для каждого из них (WRAP_CONTENT / WRAP_CONTENT), и они не будут накладываться друг на друга и заслонять друг друга.

Для вашего LinearLayout задайте ему LayoutParams с помощью FILL_PARENT для ширины и высоты.

Всякий раз, когда вы используете LayoutParams, я рекомендую вам всегда указывать, какой тип LayoutParams, чтобы избежать проблем с приведением класса, которые могут быть тем, что с вами происходит. Например, параметры макета для каждой из ваших кнопок должны быть LinearLayout .LayoutParams, и параметры для вашего LinearLayout должны быть ViewGroup.Параметры компоновки.

Наконец, вы уже вызвали setContentView()? В этом представлении уже есть ваше RelativeLayout с идентификатором custom_layout_id?

Ответ №3:

ViewGroup vg = null этого недостаточно, поскольку вы пытаетесь разыменовать значение null в следующей строке: vg.addView(ib[i], lp); . Вместо этого создайте ViewGroup с помощью одного из его конструкторов. Самый простой подход заключается в том, чтобы сделать ViewGroup vg = new ViewGroup(this); .