Ответ 1
Я не пробовал это сам, но логически, он должен работать.
Проблема в том, что переменная mGravity
(которая содержит текущую информацию о силе для LinearLayout) составляет private
. И нет доступных методов доступа, чтобы предоставить вам доступ к нему.
Одним из способов решения этой проблемы будет использование Reflection API.
Другим (и намного более чистым) способом будет расширение LinearLayout
и переопределение setGravity(int)
. Например, например:
public class LinearLayoutExposed extends LinearLayout {
// Our own gravity!
private int mGravityHolder = Gravity.START | Gravity.TOP;
public GravLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setGravity(int gravity) {
if (mGravityHolder != gravity) {
// We don't want to make changes to `gravity`
int localGravity = gravity;
// Borrowed from LinearLayout (AOSP)
if ((localGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) {
localGravity |= Gravity.START;
}
if ((localGravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) {
localGravity |= Gravity.TOP;
}
mGravityHolder = localGravity;
}
super.setGravity(gravity);
}
// And now, we have an accessor
public int getGravityVal() {
return mGravityHolder;
}
}
Как вы можете сказать, вызов getGravityVal()
в пользовательском LinearLayout
даст вам информацию о гравитации.