2016-08-10 5 views
3

Attribut "Schwerkraft" (android:gravity) kann nicht von meiner CustomView abgerufen werden.Wie GetGravity() in der benutzerdefinierten Ansicht?

XML

<MyCustomView 
... 
android:gravity="right" 
/> 

My Custom View;

class MyCustomView extends LinearLayout{ 
... 
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    getGravity(); //Throws method not found exception 
    ((LayoutParams)getLayoutParams()).gravity; //This returns the value of android:layout_gravity 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
... 
} 

getGravity(); wirft Methode nicht gefunden Ausnahme;

((LayoutParams)getLayoutParams()).gravity; gibt den Wert von Android: layout_gravity

Gibt es trotzdem ich die Schwerkraft Attribut aus der Sicht bekommen?

+2

Zuerst müssen Sie verstehen, dass die 'Schwerkraft' und' Layout_gravitation' nicht dasselbe sind. http://stackoverflow.com/documentation/android/94/layouts/398/gravity-and-layout-gravity#t=201608101551183172231 –

+4

Ich weiß, bro. Ich denke, Sie sind mit der Frage nicht klar. Ich möchte den Wert des Attributs gravity erhalten, das ich aus meinem Java-Code in XML eingegeben habe. Nicht Layoutgravitation. Ich kann die Layoutgravitation bekommen, aber nicht die Schwerkraft. –

+2

@BartekLipinski Ich glaube nicht, dass er über die beiden verwirrt ist, nur dass er einen bekommt, aber nicht den anderen, und fragt, warum er nicht 'getGravity()' – Doomsknight

Antwort

2

Die getGravity() Methode von LinearLayout wurde erst mit API 24 veröffentlicht. This answer schlägt einen Weg vor, um es in früheren Versionen zu erhalten, indem man eine Infektion verwendet.

Für nur eine normale benutzerdefinierte Ansicht, können Sie die Schwerkraft Attribut wie folgt zugreifen:

Deklarieren Sie das android:gravity Attribut in Ihrem custom attributes. Don't set the format.

<resources> 
    <declare-styleable name="CustomView"> 
     <attr name="android:gravity" /> 
    </declare-styleable> 
</resources> 

die Schwerkraft in Ihrem Projekt Layout XML ein.

<com.example.myproject.CustomView 
    ... 
    android:gravity="bottom" /> 

Holen Sie sich das Schwerkraftattribut im Konstruktor.

public class CustomView extends View { 

    private int mGravity = Gravity.START | Gravity.TOP; 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     TypedArray a = context.getTheme().obtainStyledAttributes(
       attrs, R.styleable.CustomView, 0, 0); 

     try { 
      mGravity = a.getInteger(R.styleable.CustomView_android_gravity, Gravity.TOP); 
     } finally { 
      a.recycle(); 
     } 
    } 

    public int getGravity() { 
     return mGravity; 
    } 

    public void setGravity(int gravity) { 
     if (mGravity != gravity) { 
      mGravity = gravity; 
      invalidate();  
     } 
    } 
} 

Oder stattdessen das android:gravity Attribut zu verwenden, können Sie Ihre eigenen benutzerdefinierten gravity Attribut definieren, die die gleichen Flagwerten verwendet. Siehe this answer.

Verwandte Themen