Как да създадете 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);

person Karthik Murugan    schedule 12.02.2011    source източник


Отговори (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);
    }
}

На теория всичко трябва да е ясно както е коментирано. Ако не разбирате нещо, просто ми кажете.

person Octavian A. Damiean    schedule 12.02.2011
comment
Въпреки че този пример работи, действителният ми проблем (припокриващи се контроли) остава без отговор. Повече търсене разкри решението в stackoverflow.com/questions/2305395/ Трябва изрично да зададем id с помощта на setId(). Само тогава RIGHT_OF правила имат смисъл - person Karthik Murugan; 13.02.2011
comment
Е, това донякъде се разбира от само себе си. Ако искате да получите достъп до нещо чрез неговия идентификатор, трябва също да го зададете. Това, което исках да подчертая с отговора си, беше, че го правите погрешно. Извикването на addContentView ще замени изгледа на съдържанието, който е зададен преди или който е зададен с setContentView. - person Octavian A. Damiean; 13.02.2011
comment
Не мисля така. Просто проверете тази документация: developer.android.com /reference/android/app/, android.view.ViewGroup.LayoutParams), който казва Добавяне на допълнителен изглед на съдържание към екрана. Добавени след всички съществуващи в екрана -- съществуващите изгледи НЕ се премахват - person Karthik Murugan; 17.02.2011
comment
този отговор трябва да бъде гласуван против. Едва ли има отношение към въпроса на ОП и е по допирателна - person pcodex; 28.09.2019
comment
Бих препоръчал, ако е възможно, да поставите оформлението в XML и след това да използвате LayoutInflater.inflate(...) за създаване на действителните обекти. Например, ако трябва да създадете променлив брой бутони, можете да имате XML оформление, представляващо един бутон, след което да го раздуете няколко пъти в цикъл. Имах много проблеми с опитите да направя всичко програмно, тъй като някои свойства не работят по същия начин, както в XML - person Adam Burley; 28.01.2021

Намерихте отговора в Как да оформите Views в RelativeLayout програмно?

Трябва изрично да зададем id с помощта на setId(). Само тогава RIGHT_OF правила имат смисъл.

Друга грешка, която направих, е повторното използване на обекта layoutparams между контролите. Трябва да създадем нов обект за всяка контрола

person Karthik Murugan    schedule 13.02.2011
comment
Частта с параметрите на оформлението не беше грешна. Напълно валиден е начинът, по който го определихте, но както можете да прочетете в коментара ми по-горе, не беше правилно как добавихте изгледите. - person Octavian A. Damiean; 13.02.2011

person    schedule
comment
Бутоните са един върху друг и за вашия код. - person Heinzlmaen; 11.11.2019