Rand einer Ansicht abrufen

95

Wie kann ich den Randwert einer Ansicht aus einer Aktivität abrufen? Die Ansicht kann von einem beliebigen Typ sein.

Nach einigem Suchen fand ich heraus, wie ich eine Ansicht auffüllen kann, konnte aber auf Margin nichts finden. Kann jemand helfen?

Ich habe so etwas versucht,

ViewGroup.LayoutParams vlp = view.getLayoutParams();
int marginBottom = ((LinearLayout.LayoutParams) vlp).bottomMargin;

Dies funktioniert, aber im obigen Code habe ich die Ansicht als a angenommen LinearLayout. Aber ich muss das marginAttribut auch dann abrufen, wenn ich den Ansichtstyp nicht kenne.

Arnab Chakraborty
quelle

Antworten:

180

Versuche dies:

View view = findViewById(...) //or however you need it
LayoutParams lp = (LayoutParams) view.getLayoutParams();

Ränder sind über zugänglich

lp.leftMargin;
lp.rightMargin;
lp.topMargin;
lp.bottomMargin;

edit: vielleicht ViewGroup.MarginLayoutParamsfunktioniert das für dich. Es ist eine Basisklasse für andere LayoutParams.

ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();

http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html

Vladimir
quelle
7
Eigentlich hatte ich so etwas erwartet, aber ich glaube nicht, dass es eine direkte Klasse gibt LayoutParams. Es gibt Klassen wie FrameLayout.LayoutParams, RelativeLayout.LayoutParamsaber nichts wie LayoutParamsan sich. Und da ich den Typ der Ansicht nicht kenne, kann ich keine der früheren Klassen verwenden.
Arnab Chakraborty
5
was ist ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();dann?
Vladimir
Sollte ViewGroup.MarginLayoutParams sein lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams ();
Rockhammer
4

Verwenden Sie jetzt diesen bearbeiteten Code. das wird dir helfen

FrameLayout.LayoutParams lp=(FrameLayout.LayoutParams)mainLayout.getLayoutParams();

lp.leftMargin  // for left margin
lp.rightMargin   // for right margin
ilango j
quelle
Die Methoden, die Sie erwähnt haben, geben die linke, rechte, obere und untere Position der Ansicht an. Ich benötige die Ränder.
Arnab Chakraborty
Nicht unbedingt. Eine Ansicht kann in einer LinearLayoutmit horizontalAusrichtung platziert werden. Wenn es die zweite Ansicht im Layout ist view.getLeft(), gibt mir die Methode die Koordinate der linken, aber den linken Rand der Ansicht aus der angrenzenden Ansicht.
Arnab Chakraborty
Was ist, wenn die Ansicht eine ist LinearLayout?
Arnab Chakraborty
3

Wie andere vorgeschlagen haben, ist layout_margin # der Abstand zwischen der # Kante des Elternteils und Ihrer Ansicht.

  • # ersetzt "Links", "Rechts", "Oben" oder "Unten"

Das Erhalten / Festlegen von Margen funktionierte für mich mit:

ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.topMargin += 20;
mView.requestLayout();

Natürlich war meine Ansicht tatsächlich eine ViewGroup und die übergeordnete war auch eine ViewGroup. In den meisten Fällen sollten Sie Ihre Layoutparameter in die View-Klasse LayoutParams des übergeordneten Elements umwandeln (in diesem Fall ViewGroup und RelativeLayout).

milosmns
quelle