Получить LinearLayout Gravity

Мне нужно было получить значение силы тяжести LinearLayout. Я проверил документацию, и я только нашел, как ее установить (setGravity(value)). Кто-нибудь знает, есть ли способ получить гравитацию LinearLayout?

Спасибо

Ответ 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 даст вам информацию о гравитации.

Ответ 2

API >= 24

getGravity()

https://developer.android.com/reference/android/widget/LinearLayout.html#getGravity()

API < 24

с использованием отражения:

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) {}

Ответ 3

Вы должны получить его из LayoutParams LinearLayout:

mLinearLayout.getLayoutParams().gravity

@see doc LinearLayout.LayoutParams:

public int  gravity Gravity for the view associated with these LayoutParams.