2

AppbarlayoutにはTextViewに多数のテキストが含まれている可能性があります。AndroidのAppbarlayoutに大きなテキストの高さの問題があります

TextViewは2行ですべてOKですが、TextViewを展開するとAppbarlayoutがカットされ、残りの部分が空白になります。

ノーマル: normal

は拡張: expanded

を上にスクロール: scrolled up

レイアウトコード:

<?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; 
       } 
      } 
     }); 
    } 
} 

これはAppbarLayoutまたはCoordinatorLayoutのバグですか?

+0

はなぜあなたが設定した アンドロイド:layout_marginTop =「200dp」とAndroid:MAXLINES =「2」、それらを削除してから、TextViewの上記一部のコンテンツがあります私のアプリで –

+0

を試してみてください、私はにmarginTopを設定してくださいケースをシミュレートします。 TextViewをクリックすると拡大または縮小して詳細テキストを表示または非表示にすることができます。そのため、TextViewのmaxLinesを変更します。私はmaxLinesを削除し、TextViewは2番目のスクリーンショットのように最初から展開していました。スクロールしても3番目のスクリーンショットのように空白が残っていました。 – ffts

+0

私の電話とエミュレータでテストしても問題はありません。多分あなたの電話のバグ? –

答えて

0

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); 
    } 
} 
0

高さは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); 
    } 
} 
関連する問題