2016-08-10 4 views
3

Не удается получить атрибут гравитации (android:gravity) из моего CustomView.Как getGravity() в пользовательском представлении?

XML

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

Мой заказ Просмотр;

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(); бросает метод не нашел исключение;

((LayoutParams)getLayoutParams()).gravity; возвращает значение андроида: layout_gravity

Есть в любом случае я могу получить атрибут силы тяжести с точки зрения?

+2

Прежде всего вам нужно понять, что 'gravity' и' layout_gravity' - это не одно и то же. http://stackoverflow.com/documentation/android/94/layouts/398/gravity-and-layout-gravity#t=201608101551183172231 –

+4

Я знаю брата. Я думаю, вы не совсем поняли этот вопрос. Я хочу получить значение атрибута гравитации, которое я вставляю в XML из своего java-кода. Не layout_gravity. Я могу получить layout_gravity, но не гравитацию. –

+2

@BartekLipinski Я не думаю, что он запутался в двух, просто, что он может получить один, но не другой, и вопросы, почему он не может 'getGravity()' – Doomsknight

ответ

2

Метод getGravity()LinearLayout был опубликован только с API 24. This answer предлагает способ получить его в более ранних версиях с помощью исправления.

Для только нормального пользовательской точки зрения, вы можете получить доступ к атрибуту силы тяжести, как это:

Объявить атрибут android:gravity в вашем custom attributes. Don't set the format.

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

Установить гравитацию в макете проекта XML.

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

Получить атрибут тяжести в конструкторе.

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

Или вместо того, чтобы использовать атрибут android:gravity, вы можете определить свой собственный gravity атрибут, который использует то же значение флага. См. this answer.

Смежные вопросы