为什么将layout_marginTop设置的视图和置于水平LinearLayout内的gravity = bottom导致边距出现在底部?

时间:2016-01-26 13:03:30

标签: android android-layout android-linearlayout

我尝试在layout_marginTop水平gravity=bottom内添加LinearLayout设置和<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff0000" android:orientation="horizontal"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginTop="8dp" android:background="#0000ff" android:textSize="24sp" android:text="TEST"/> </LinearLayout> 视图,并且无缘无故导致边距显示在底部。

我知道这种布局可能会有所不同,但我无法理解为什么我会得到这样的结果。

这是xml布局:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {


        View rootView = inflater.inflate(R.layout.fragment_home, container, false);

            mViewFlipper = (ViewFlipper) rootView.findViewById(R.id.view_flipper);
            mViewFlipper.setAutoStart(true);
            mViewFlipper.setFlipInterval(4000);
            Random mRandom = new Random();
            mViewFlipper.setDisplayedChild(mRandom.nextInt(400));
            mViewFlipper.startFlipping();

结果如下:

enter image description here

有这个想法吗?

2 个答案:

答案 0 :(得分:2)

在深入研究源代码之后,似乎这种行为的根本原因是LinearLayout默认情况下它的子行View与其基线对齐。当它计算出孩子View的垂直偏移时,它会考虑sum of the vertical margins。然后,这些offsetsafter the "normal" top (y) coordinates are calculated应用于子View

所有这一切的结果是,如果您希望TextView在底部对齐,请将LinearLayout的{​​{1}}属性设置为baselineAligned

false

答案 1 :(得分:0)

TextView设置有自己的LAYOUT GRAVITY到底部,即TextView的整个主体与底部对齐,如果方向是水平的,它将没有区别,因为它是linearLayout它不适用于marginTop当layoutGravity的视图是设置为Bottom,删除layoutGravity并保持marginTop它将接近上面提到的边距。!

为什么不在基础上。? 因为你给它一个余量,当你给它一些值时,如果你已经给它布局了底部,那么它就是底部对齐并从中给出边距。!

希望我帮助你,如果不完全的话。