如何在自定义视图中获取GetGravity()?

Ye *_*tut 7 android custom-view

无法android:gravity从我的CustomView 获取gravity属性().

XML

<MyCustomView
 ...
 android:gravity="right"
 />
Run Code Online (Sandbox Code Playgroud)

我的自定义视图;

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);
  }
 ...
}
Run Code Online (Sandbox Code Playgroud)

getGravity(); 抛出方法未找到异常;

((LayoutParams)getLayoutParams()).gravity; 返回android:layout_gravity的值

无论如何我可以从视图中获取引力属性吗?

Sur*_*gch 6

getGravity()方法LinearLayout仅从API 24开始公开.这个答案提出了一种通过使用反射在早期版本中获取它的方法.

对于普通的自定义视图,您可以像这样访问gravity属性:

android:gravity自定义属性中声明属性.不要设置格式.

<resources>
    <declare-styleable name="CustomView">
        <attr name="android:gravity" />
    </declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)

在项目布局xml中设置重力.

<com.example.myproject.CustomView
    ...
    android:gravity="bottom" />
Run Code Online (Sandbox Code Playgroud)

在构造函数中获取gravity属性.

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();    
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者android:gravity,您可以定义自己的gravity使用相同标志值的自定义属性,而不是使用该属性.看到这个答案.