Получить LinearLayout Gravity

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

Спасибо

3 ответа

Решение

Я не пробовал это сам, но по логике, это должно работать.

Проблема в том, что переменная 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 даст вам информацию о гравитации.

API> = 24

getGravity ()

https://developer.android.com/reference/android/widget/LinearLayout.html

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

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

mLinearLayout.getLayoutParams().gravity

@ см. документ LinearLayout.LayoutParams:

public int  gravity Gravity for the view associated with these LayoutParams.
Другие вопросы по тегам