2016-08-10 4 views
3

Impossible d'obtenir l'attribut de gravité (android:gravity) à partir de mon CustomView.Comment obtenirGravity() en mode personnalisé?

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(); throws exception non trouvée;

((LayoutParams)getLayoutParams()).gravity; renvoie la valeur d'Android: layout_gravity

Y at-il de toute façon je peux obtenir l'attribut de gravité de la vue?

+2

D'abord, vous devez comprendre que 'gravity' et' layout_gravity' ne sont pas la même chose. http://stackoverflow.com/documentation/android/94/layouts/398/gravity-and-layout-gravity#t=201608101551183172231 –

+4

Je connais frère. Je pense que vous n'êtes pas clair avec la question. Je veux obtenir la valeur de l'attribut de gravité que j'ai mis en XML de mon code java. Pas layout_gravity. Je peux obtenir le layout_gravity mais pas la gravité. –

+2

@BartekLipinski Je ne pense pas qu'il soit confus au sujet des deux, juste qu'il est capable d'en obtenir un, mais pas l'autre, et se demande pourquoi il ne peut pas getGravity() ' – Doomsknight

Répondre

2

La méthode getGravity() de LinearLayout n'a été rendu public à partir avec l'API 24. This answer suggère une façon de l'obtenir dans les versions antérieures à l'aide refection.

Pour seulement une vue personnalisée normale, vous pouvez accéder à l'attribut de gravité comme celui-ci:

Déclare l'attribut android:gravity dans votre custom attributes. Don't set the format.

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

Définir la gravité dans votre mise en page de projet xml.

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

Obtenez l'attribut de gravité dans le constructeur.

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

Ou au lieu d'utiliser l'attribut android:gravity, vous pouvez définir votre propre attribut gravity personnalisé qui utilise les mêmes valeurs de drapeau. Voir this answer.