【问题标题】:Android Appbarlayout with a large text height issue带有大文本高度问题的 Android Appbarlayout
【发布时间】:2016-03-30 06:46:36
【问题描述】:

Appbarlayout 有一个TextView 可能包含大量文字。

在开始时TextView 是 2 行,一切正常,但是当我展开 TextView 时,Appbarlayout 被剪切,当我向上滚动时,其余部分为空白。

正常:

扩展:

向上滚动:

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/view_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/black"
            app:elevation="0dp"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/holo_green_dark"
                app:layout_scrollFlags="scroll">

                <TextView
                    android:id="@+id/text"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="200dp"
                    android:maxLines="2"
                    android:text="test" />

            </LinearLayout>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:background="@android:color/holo_blue_bright"
                android:text="TAB" />

        </android.support.design.widget.AppBarLayout>

        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/holo_orange_light"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </android.support.v4.widget.NestedScrollView>
    </android.support.design.widget.CoordinatorLayout>
</LinearLayout>

活动代码:

package me.ffts.demo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    boolean isOpen = false;
    TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        text.setText("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isOpen) {
                    text.setMaxLines(2);
                    isOpen = false;
                } else {
                    text.setMaxLines(Integer.MAX_VALUE);
                    isOpen = true;
                }
            }
        });
    }
}

这是AppbarLayoutCoordinatorLayout 的错误吗?

【问题讨论】:

  • 你为什么要设置 android:layout_marginTop="200dp" 和 android:maxLines="2" 请把它们去掉再试试
  • 在我的应用中TextView上面有一些内容,所以我设置了一个marginTop来模拟这种情况。当我单击 TextView 以显示或隐藏详细文本时,TextView 可以展开或关闭,因此我更改了 TextView 的 maxLines 来做到这一点。我删除了 maxLines,TextView 在开始时像第二个屏幕截图一样展开,当我向上滚动时,它仍然像第三个屏幕截图一样显示空白。
  • 在我的手机和模拟器中测试,没有你说的问题。也许是你手机的错误?
  • 你修好了吗?

标签: android android-coordinatorlayout androiddesignsupport android-appbarlayout


【解决方案1】:

看起来 AppBarLayout 正在截断它的高度;如果你将android:layout_height 硬编码成一些大的东西,比如 2000 dp,你会发现它正在绘制所有内容。我通过强制 AppBarLayout 测量其所有子级,然后设置其高度来解决此问题。

public class HeightWrappingAppBarLayout extends AppBarLayout {

    public HeightWrappingAppBarLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);
                height += child.getMeasuredHeight();
            }
        }
        int width = MeasureSpec.getSize(widthMeasureSpec);
        setMeasuredDimension(width, height);
    }
}

【讨论】:

    【解决方案2】:

    使用 MeasureSpec.UNSPECIFIED 作为高度。

    public class ScrollAppBarLayout extends AppBarLayout {
        public ScrollAppBarLayout(Context context) {
            super(context);
        }
    
        public ScrollAppBarLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec,
                    MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED));
        }
    
        @Override
        protected void measureChild(View child, int parentWidthMeasureSpec,
                                    int parentHeightMeasureSpec) {
            ViewGroup.LayoutParams lp = child.getLayoutParams();
    
            int childWidthMeasureSpec;
            int childHeightMeasureSpec;
    
            childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, getPaddingLeft()
                    + getPaddingRight(), lp.width);
    
            childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
                    MeasureSpec.getSize(parentHeightMeasureSpec), MeasureSpec.UNSPECIFIED);
    
            child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
        }
    
        @Override
        protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
                                               int parentHeightMeasureSpec, int heightUsed) {
            final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
    
            final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
                    getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin
                            + widthUsed, lp.width);
            final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
                    MeasureSpec.getSize(parentHeightMeasureSpec), MeasureSpec.UNSPECIFIED);
    
            child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 2015-01-04
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多