/ Programové pridanie tlačidiel do relatívneho rozloženia - android

Programové pridanie tlačidiel do relatívneho rozloženia - android

Viem, že to asi nie je ten najlepší typotázka sa tu pýtať kvôli nedostatku výskumu, ale nemám tušenie, kam tu začať hľadať. Všetko sa zdá, že by to malo fungovať v pohode. Každopádne sa snažím programovo pridať niekoľko tlačidiel do aplikácie UI aplikácie, aby som zabezpečil, že používateľské rozhranie sa zmení a prispôsobí všetkým obrazovkám bez problémov. Tu je veľmi drsná myšlienka formátu, ktorý potrebujem (samozrejme s textom v každom tlačidle)

A to je to, čo dostanem.

@Override
protected void onCreate(Bundle savedInstanceState) {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = (RelativeLayout) findViewById(R.id.activity_main);
Point size = new Point();
Display display = getWindowManager().getDefaultDisplay();
display.getRealSize(size);
params = new RelativeLayout.LayoutParams(size.x / 5, 200);
padding = size.x / 5;
addButtons();
}

public void addButtons() {
Button update = new Button(this);
RelativeLayout.LayoutParams updateParams = params;
updateParams.addRule(RelativeLayout.CENTER_VERTICAL);
update.setLayoutParams(updateParams);
update.setPadding(padding, 0, 0, 0);
update.setText("Update Me!");
update.setOnClickListener(new ClickHandler("app_update"));
updateId = update.generateViewId();
update.setId(updateId);
layout.addView(update);

Button install = new Button(this);
RelativeLayout.LayoutParams installParams = params;
installParams.addRule(RelativeLayout.RIGHT_OF, update.getId());
installParams.addRule(RelativeLayout.CENTER_VERTICAL);
install.setLayoutParams(installParams);
install.setPadding(padding, 0, 0, 0);
install.setText("Install LastBox");
install.setOnClickListener(new ClickHandler("kodi_install"));
installId = install.generateViewId();
install.setId(installId);
layout.addView(install);

Button dlFamily = new Button(this);
RelativeLayout.LayoutParams dlFamilyParams = params;
dlFamilyParams.addRule(RelativeLayout.RIGHT_OF, install.getId());
dlFamilyParams.addRule(RelativeLayout.ABOVE, install.getId());
dlFamily.setLayoutParams(dlFamilyParams);
dlFamily.setPadding(padding, 0, 0, padding);
dlFamily.setText("Download Family Build");
dlFamily.setOnClickListener(new ClickHandler("family_download"));
dlFamilyId = dlFamily.generateViewId();
dlFamily.setId(dlFamilyId);
layout.addView(dlFamily);

Button upFamily = new Button(this);
RelativeLayout.LayoutParams upFamilyParams = params;
upFamilyParams.addRule(RelativeLayout.RIGHT_OF, install.getId());
upFamilyParams.addRule(RelativeLayout.BELOW, install.getId());
upFamily.setLayoutParams(upFamilyParams);
upFamily.setPadding(padding, padding, 0, 0);
upFamily.setText("Update Family Build");
upFamily.setOnClickListener(new ClickHandler("family_update"));
upFamilyId = upFamily.generateViewId();
upFamily.setId(upFamilyId);
layout.addView(upFamily);

Button dlAdult = new Button(this);
RelativeLayout.LayoutParams dlAdultParams = params;
dlAdultParams.addRule(RelativeLayout.RIGHT_OF, dlFamily.getId());
dlAdultParams.addRule(RelativeLayout.ABOVE, install.getId());
dlAdult.setLayoutParams(dlAdultParams);
dlAdult.setPadding(padding, 0, 0, padding);
dlAdult.setText("Download Adult Build");
dlAdult.setOnClickListener(new ClickHandler("adult_download"));
dlAdultId = dlAdult.generateViewId();
dlAdult.setId(dlAdultId);
layout.addView(dlAdult);

Button upAdult = new Button(this);
RelativeLayout.LayoutParams upAdultParams = params;
upAdultParams.addRule(RelativeLayout.RIGHT_OF, upFamily.getId());
upAdultParams.addRule(RelativeLayout.BELOW, install.getId());
upAdult.setLayoutParams(upAdultParams);
upAdult.setPadding(padding, padding, 0, 0);
upAdult.setText("Update Adult Build");
upAdult.setOnClickListener(new ClickHandler("adult_update"));
upAdultId = upAdult.generateViewId();
upAdult.setId(upAdultId);
layout.addView(upAdult);
}

Nepožadujem ani nejakú magickú "opravupretože som "mňa lenivé" riešenie. Ukážte mi správnym smerom, ukážte mi, kam sa musím pozrieť, podobné veci. Mám rád riešenie týchto problémov, ale začať na správnom mieste by bolo úžasné.

odpovede:

0 pre odpoveď č. 1

Používate to isté RelativeLayout.LayoutParams params pre všetky vaše tlačidlá. V jazyku Java všetky priradenia neprívečných typov sa robia odkazom, takže keď to robíte

RelativeLayout.LayoutParams updateParams = params;
RelativeLayout.LayoutParams installParams = params;
RelativeLayout.LayoutParams dlFamilyParams = params;

atď. priradíte ten istý objektpamäť pre rôzne premenné. Premenné sú len textové odkazy na určité adresy pamäte, takže pri rôznych názvoch odkazujete vždy na ten istý objekt v pamäti.

Nastavili ste pre každé tlačidlo rôzne rozloženieParams vlastnosti pre umiestnenie do pohľadu. Ak sme však povedali, že odkazujeme vždy na ten istý objekt v pamäti, potom aktualizujeme vždy ten istý objekt, a preto uprednostňujeme predchádzajúce nastavenia a udržiavame iba posledné nastavenia.

Preto nastavujete rovnaký objekt params na všetky vaše tlačidlá.

Kombinácia týchto chýb má za následok, že všetky vaše tlačidlá majú rovnaké RelativeLayout.LayoutParams s jeho nastavením, sú umiestnené jeden nad druhým a môžete vidieť iba posledné pridané.

Budete musieť vytvoriť iný objekt params pre každé tlačidlo, ako nasledujúce:

RelativeLayout.LayoutParams updateParams = new RelativeLayout.LayoutParams(size.x / 5, 200);
...
RelativeLayout.LayoutParams installParams = new RelativeLayout.LayoutParams(size.x / 5, 200);
...

Ak chcete analyzovať problémy so zobrazením, odporúčam vám použiť nástroj Layout Inspector, ktorý je dostupný v ponuke Nástroje -> Android


0 pre odpoveď č. 2

skúste to

RelativeLayout layout =   (RelativeLayout)findViewById(R.id.activity_main);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT );


for (int i=0; i<10; i++) {
Button button= new Button(this);
button.setText("some_text");
button.setId(i);

// lp.addRule(RelativeLayout.RIGHT_OF, <Id>);

layout.addView(tv2, lp);
}