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的值
无论如何我可以从视图中获取引力属性吗?
该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使用相同标志值的自定义属性,而不是使用该属性.看到这个答案.