4

ScrollViewaLinearLayoutとその子を持つ aを含むレイアウトがあります: PercentRelativeLayout23.2.1、そのLinearLayout下に別のもの、PercentRelativeLayoutその後に別のもの。真ん中LinearLayoutRecyclerView( LinearLayoutManager, 垂直) があります。以下に例を示します。

実行時にRecyclerViewデータを入力すると、空のデータから開始するため、そのサイズが大きくなります。高さが画面サイズを超えて変化すると、パーセンテージ値を高さとして持つ車 (id = 車) の上部の画像が画面から完全に消えます。この画面を上下にスクロールすると、上端と下端の両方に到達し、画像が表示されません。

また、このレイアウトのもう 1 つの場所にパーセンテージ値があり、それらは を定義していますmarginTop。これらの余白も消えます。幅に依存するパーセンテージ値は正常に機能します。Java コードには、画像の可視性の変更は含まれず、余白は調整されません。

この問題がサポート ライブラリの特定のバージョンに関連しているかどうかは現在わかりません。このライブラリがリリースされたのと同時に、この画面を作成していました。また、この問題は Marshmallow では発生せず、Lo​​llipop 以下でのみ発生します。この問題を解決する方法について何か助けていただければ幸いです。

<!-- a container for all views that should scroll -->
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!-- the first block of views - they need percents -->
    <android.support.percent.PercentRelativeLayout
        android:id="@+id/carHolder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/car"
            android:layout_width="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:src="@drawable/car"
            app:layout_heightPercenet="25%"/>

        <ImageView
            android:id="@+id/sliderBg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/car"
            android:layout_centerHorizontal="true"
            android:src="@drawable/slider_bg"/>

    </android.support.percent.PercentRelativeLayout>

    <!-- a middle block of views, they don't need percents -->
     <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

         <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

    </LinearLayout>

    <!-- another block of views, they need percents -->
    <android.support.percent.PercentRelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <!-- some other views --> 

    </android.support.percent.PercentRelativeLayout>

</LinearLayout>

アップデート

この問題は、サポート ライブラリ 23.3.0 でも見られます。これは、 にデータを入力するときだけでなく、 が画面の高さを超えるRecyclerViewたびに発生します。ScrollView

4

3 に答える 3

2

残念ながら、パーセント レイアウトは、M より前の ScrollView では機能しません。その理由は、測定ステップで提供されるサイズ ヒントに依存するためです。M 以前は、未指定のメジャー スペックを送信するときに、ほとんどのレイアウトでサイズ ヒント 0 が提供されていました。

ScrollView の独自のサブクラスを作成し、measureChild と measureChildWithMargins をオーバーライドして (幸いなことに両方とも保護されています)、サイズのヒントを提供することで、これを修正することができます。ソース- plus.google.com

この CustomScrollView を使用して、percentRelativeLayout を機能させることができます

public class CustomScrollView extends ScrollView {


public CustomScrollView(Context context) {
    super(context);
}

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

public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int size = 0;
    int width = getMeasuredWidth();
    int height = getMeasuredHeight();

    if (width > height) {
        size = height;
    } else {
        size = width;
    }
    setMeasuredDimension(size, size);
}
}

ソースはScrollView 内の PercentRelativeLayout です

于 2016-04-27T10:18:12.723 に答える
1

ここでパラメーターが正常に機能することがありlayout_aspectRatioます。ビューの幅もわかっているので、このパラメーターとパーセントベースの幅を使用して、好みの高さにすることができます。このソリューションでは、高さは画面の幅に依存するため、さまざまなサイズで問題になる可能性があります。

<ImageView
    android:id="@+id/car"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:src="@drawable/car"
    app:layout_aspectRatio="175%"
    app:layout_widthPercent="70%"/>

この回答を一時的な解決策としてマークし、問題を正しい方法で解決するのに役立つ他の回答を受け入れます。

于 2016-04-26T13:27:56.167 に答える
0

これは で問題を解決する方法についての回答ではありませんPercentRelativeLayoutが、探しているのがそれだけの場合に備えて、レイアウトでパーセンテージを使用する方法の例です。

<!-- a container for all views that should scroll -->
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!-- the first block of views - they need percents -->
    <LinearLayout
        android:id="@+id/carHolder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:weightSum="1">

        <ImageView
            android:id="@+id/car"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="0.25"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/car" />

        <ImageView
            android:id="@+id/sliderBg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/slider_bg"/>

    </LinearLayout>

    <!-- a middle block of views, they don't need percents -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </LinearLayout>

    <!-- another block of views, they need percents -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:weightSum="1">

        <!-- some other views -->

    </LinearLayout>

</LinearLayout>

こちらにもわかりやすい解説が!

LinearLayout weightSum リファレンス

于 2016-04-26T00:51:33.043 に答える