获取LinearLayout的Gravity属性

3

我需要获取 LinearLayout 的重力值。我查看了文档,只找到如何设置重力值 (setGravity(value))。请问是否有一种方法可以获取 LinearLayout 的重力值?

谢谢。


这是一个好问题。我试着自己回答,但我做不到。不过,这是我学到的东西:https://dev59.com/9YXca4cB1Zd3GeqPIG7W#27086487 - Suragch
3个回答

6
我自己没有尝试过,但从逻辑上讲,应该是可以的。
问题在于变量(它保存LinearLayout的当前重力信息)是私有的。而且没有访问器方法可供您访问它。
解决这个问题的一种方式是使用反射API。
另一种更简洁的方法是扩展并覆盖。例如,像这样:
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;
    }
}

您可以看出,在自定义 LinearLayout 上调用 getGravityVal() 将获得重力信息。


1
很好的答案!谢谢。您认为标准LinearLayout的mGravity为什么是私有的?人们通常不需要访问它吗? - Suragch
@Suragch “人们通常不需要访问这个吗?”我很惊讶地发现重力值无法被访问。肯定有人在某处需要它,对吧?但是,我已经使用LinearLayouts(以及Android)工作了一年多了。我甚至没有需要访问此值的需求。虽然这是一个有趣的问题。您是否有需要访问此值的用例?还是赏金纯粹是为了学习目的? - Vikram
1
这个赏金是为了学习目的,或者说,因为我尝试自己回答问题但失败了。 - Suragch

3

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

-2
你应该从LinearLayout的LayoutParams中获取它:
mLinearLayout.getLayoutParams().gravity

请参阅LinearLayout.LayoutParams的文档:

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

1
我在文档中看到了这个,但它似乎与android:gravity无关,而是与android:layout_gravity相关。http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html ,我错了吗? - Daniel
我也同意这会获取layout_gravity而不是gravity。 - Suragch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接