2017-01-04 2 views
1

Ich weiß, dass dies wahrscheinlich nicht die beste Frage ist, die hier wegen mangelnder Forschung gestellt wird, aber ich habe keine Ahnung, wo ich anfangen soll. Alles scheint so zu sein, dass es gut funktionieren sollte. Jedenfalls versuche ich programmatisch mehrere Schaltflächen zu meiner App-UI hinzuzufügen, um sicherzustellen, dass die Benutzeroberfläche passt und sich nahtlos an alle Bildschirme anpasst. Here is a very rough idea of the format I'm needing (with text in each button of course)Programmatisch Schaltflächen zum relativen Layout hinzufügen

And this is what I'm getting.

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

Ich suche nicht einmal für einige magische „reparieren es für mich, weil ich zu faul bin“ Lösung. Zeige mir in die richtige Richtung, zeig mir, wo ich hinschauen muss, solche Sachen. Ich genieße es, diese Probleme zu lösen, aber am richtigen Ort zu beginnen wäre wunderbar.

Antwort

0

Sie verwenden die gleichen RelativeLayout.LayoutParams params für alle Ihre Tasten. In Java werden alle nicht vom Urtyp Zuweisungen durch Bezug genommen, so dass, wenn Sie tun

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

und so weiter, zuweisen Sie das gleiche Objekt im Speicher, um verschiedene Variablen. Variablen sind nur textuelle Verweise auf bestimmte Speicheradressen, so dass Sie bei unterschiedlichen Namen immer auf das gleiche Objekt im Speicher verweisen.

Sie legen für jede Schaltfläche verschiedene Layoutparameter fest, um sie in der Ansicht zu positionieren. Aber wenn wir sagen, dass wir immer auf das gleiche Objekt im Speicher verweisen, aktualisieren wir immer das gleiche Objekt und überschreiben so die vorherigen Einstellungen, und wir behalten nur die letzten Einstellungen bei.

Sie setzen also das gleiche Parameterobjekt auf alle Ihre Schaltflächen.

Die Kombination dieser Fehler führt dazu, dass alle Ihre Buttons mit den gleichen RelativeLayout.LayoutParams mit seinen Einstellungen versehen sind, sie werden übereinander platziert und Sie können nur die zuletzt hinzugefügten sehen.

Sie haben ein anderes params-Objekt für jede Schaltfläche erstellen wie folgt:

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

Ansichten Probleme analysieren Ich schlage vor, Sie Layout-Inspector-Tool zu verwenden, mit dem Menü Extras -> Android

+0

Vielen Dank für die Antwort. Das hat den Trick gemacht. Ich bin am vertrautesten mit C++, also war es seltsam für mich zu entdecken, dass die meisten Variablen in Java Referenz sind! Faszinierend. Wie auch immer, die Tasten haben keinen Text, trotz meiner setText-Methoden auf jeder Taste. Irgendeine Idee? –

0

try dies

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