Мне нужно было получить значение силы тяжести LinearLayout
. Я проверил документацию, и я только нашел, как ее установить (setGravity(value)
). Кто-нибудь знает, есть ли способ получить гравитацию LinearLayout
?
Спасибо
Мне нужно было получить значение силы тяжести LinearLayout
. Я проверил документацию, и я только нашел, как ее установить (setGravity(value)
). Кто-нибудь знает, есть ли способ получить гравитацию LinearLayout
?
Спасибо
Я не пробовал это сам, но логически, он должен работать.
Проблема в том, что переменная 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
даст вам информацию о гравитации.
getGravity()
https://developer.android.com/reference/android/widget/LinearLayout.html#getGravity()
с использованием отражения:
int gravity = -1;
try {
final Field staticField = LinearLayout.class.getDeclaredField("mGravity");
staticField.setAccessible(true);
gravity = staticField.getInt(linearLayout);
//Log.i("onFinishInflate", gravity+"");
}
catch (NoSuchFieldException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
Вы должны получить его из LayoutParams LinearLayout:
mLinearLayout.getLayoutParams().gravity
@see doc LinearLayout.LayoutParams:
public int gravity Gravity for the view associated with these LayoutParams.