2016-08-10 60 views
3

無法從我的CustomView中獲取引力屬性(android:gravity)。如何在自定義視圖中獲取Gravity()?

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(); throws方法找不到異常;

((LayoutParams)getLayoutParams()).gravity;回報的Android值:layout_gravity

反正我有可以從視圖中的重力屬性?

+2

首先你需要明白'gravity'和'layout_gravity'不是一回事。 http://stackoverflow.com/documentation/android/94/layouts/398/gravity-and-layout-gravity#t=201608101551183172231 –

+4

我知道兄弟。我認爲你不清楚這個問題。我想要從我的java代碼中獲取XML中的重力屬性的值。不是layout_gravity。我可以得到layout_gravity,但不是重力。 –

+2

@BartekLipinski我不認爲他對這兩者感到困惑,只是他能夠得到一個,而不是另一個,並質疑爲什麼他不能'getGravity()' – Doomsknight

回答

2

LinearLayoutgetGravity()方法僅在API 24開始公開。This answer提出了一種使用反射在早期版本中獲取它的方法。

對於只是一個普通的自定義視圖,您可以訪問重力屬性是這樣的:

聲明android:gravity屬性,爲custom attributesDon'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

相關問題