Wie setze ich RelativeLayout-Layoutparameter in Code, nicht in XML?

112

Zum Beispiel möchte ich 3 Schaltflächen auf dem Bildschirm hinzufügen: eine links ausrichten, eine Mitte ausrichten, die letzte rechts ausrichten.

Wie kann ich ihr Layout in Code einstellen, nicht in xml?

Qing
quelle

Antworten:

269

Nur ein einfaches Beispiel:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
Button button1;
button1.setLayoutParams(params);

params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.RIGHT_OF, button1.getId());
Button button2;
button2.setLayoutParams(params);

Wie Sie sehen, müssen Sie Folgendes tun:

  1. Erstellen Sie ein RelativeLayout.LayoutParamsObjekt.
  2. Verwenden Sie addRule(int)oder addRule(int, int), um die Regeln festzulegen. Die erste Methode wird verwendet, um Regeln hinzuzufügen, für die keine Werte erforderlich sind.
  3. Stellen Sie die Parameter auf die Ansicht ein (in diesem Fall auf jede Schaltfläche).
Cristian
quelle
15
Hier gibt es ein paar Probleme. Zunächst sehe ich nicht, wo Sie tatsächlich button1 oder button2 instanziieren. Zweitens werden dynamisch deklarierte Ansichten (ImageViews, Buttons usw.) mit der ID -1 instanziiert. Eine ID von -1 funktioniert für eine Regel nicht.
Craig B
3
LayoutParams gibt es nicht. Die Basisklasse ist eigentlich ViewGroup.LayoutParams. Wenn Sie es kürzer möchten, fügen Sie einfach einen Import hinzu, der Folgendes enthält RelativeLayout.LayoutParams.
Cristian
17
    RelativeLayout layout = new RelativeLayout(this);
    RelativeLayout.LayoutParams labelLayoutParams = new RelativeLayout.LayoutParams(
            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    layout.setLayoutParams(labelLayoutParams);


   // If you want to add some controls in this Relative Layout
    labelLayoutParams = new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    labelLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);


    ImageView mImage = new ImageView(this);
    mImage.setBackgroundResource(R.drawable.popupnew_bg);        
    layout.addView(mImage,labelLayoutParams);

    setContentView(layout);
Amit Thaper
quelle
6

Etwas wie das..

 RelativeLayout linearLayout = (RelativeLayout) findViewById(R.id.widget43);
                // ListView listView = (ListView) findViewById(R.id.ListView01);

                LayoutInflater inflater = (LayoutInflater) this
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                // View footer = inflater.inflate(R.layout.footer, null);
                View footer = LayoutInflater.from(this).inflate(R.layout.footer,
                        null);
                final RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.FILL_PARENT,
                        RelativeLayout.LayoutParams.FILL_PARENT);
                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1);
footer.setLayoutParams(layoutParams);
Rohit Mandiwal
quelle
4

Wie wäre es, wenn Sie einfach die Layout-Parameter aus der Ansicht selbst ziehen, wenn Sie sie erstellt haben.

$((RelativeLayout)findViewById(R.id.imageButton1)).getLayoutParams();
Chidi Michael Ekeocha
quelle
0

Ich hoffe der folgende Code wird helfen. Es werden ein EditText und eine Anmeldeschaltfläche erstellt. Beide relativ platziert. Alles erledigt in MainActivity.java.

package com.example.atul.allison;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.RelativeLayout;
import android.widget.Button;
import android.graphics.Color;
import android.widget.EditText;
import android.content.res.Resources;
import android.util.TypedValue;     
    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //Layout
            RelativeLayout atulsLayout = new RelativeLayout(this);
            atulsLayout.setBackgroundColor(Color.GREEN);

            //Button
            Button redButton = new Button(this);
            redButton.setText("Log In");
            redButton.setBackgroundColor(Color.RED);

            //Username input
            EditText username =  new EditText(this);

            redButton.setId(1);
            username.setId(2);

            RelativeLayout.LayoutParams buttonDetails= new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT
            );

            RelativeLayout.LayoutParams usernameDetails= new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT
            );

            //give rules to position widgets
            usernameDetails.addRule(RelativeLayout.ABOVE,redButton.getId());
            usernameDetails.addRule(RelativeLayout.CENTER_HORIZONTAL);
            usernameDetails.setMargins(0,0,0,50);

            buttonDetails.addRule(RelativeLayout.CENTER_HORIZONTAL);
            buttonDetails.addRule(RelativeLayout.CENTER_VERTICAL);

            Resources r = getResources();
            int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200,r.getDisplayMetrics());
            username.setWidth(px);

            //Add widget to layout(button is now a child of layout)
            atulsLayout.addView(redButton,buttonDetails);
            atulsLayout.addView(username,usernameDetails);

            //Set these activities content/display to this view
            setContentView(atulsLayout);
        }
    }
Atul Chavan
quelle