web-dev-qa-db-ja.com

Android ScrollViewは表示されるコンテンツの高さを設定します

レイアウト内に静的な高さのスクロール可能な領域があるという問題を解決しようとして、多くの問題を抱えています。同じ画面に表示する必要のある3つの長いリストがあり、すべてのエントリを順番に表示することは完全に非現実的です。そのため、カテゴリをスキップする場合は、数百ものエントリをスクロールする必要があるためです。

内部にリニアレイアウトがあるスクロールビューがあると仮定します。たとえば、画面の高さは最大で250 dpで、250 dpのスペースに収まるよりも多くのエントリを入力すると、個別にスクロールできるようにします。

私が今持っているのは:

<ScrollView
    Android:minWidth="25px"
    Android:minHeight="150px"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/XXXXXXX"
    Android:scrollbars="vertical">

    <LinearLayout
        Android:orientation="vertical"
        Android:minWidth="25px"
        Android:minHeight="25px"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/XXXXXX" />
</ScrollView>

データが入力されると、コンテンツに合わせる必要がある限り、scrollviewとlinearlayoutは伸縮し、そのすべてを表示します代わりに 250dp/pxの「ウィンドウ」(どの測定でもいいです)その中でスクロール可能なコンテンツ。

私はAndroidプラットフォームに慣れていないので、おそらく答えは明白であり、私は言語を理解していませんでしたが、どんな助けも大歓迎です!ありがとうございます

---解決済み:高さのあるScrollViewの外側にlinearLayoutを配置します。

12
user2150445

必要なのはmaxHeightです。ただし、ビューではサポートされていないため、回避策を使用する必要があります。

この答えをチェックしてください:

https://stackoverflow.com/a/13811461/770467

3
Androiderson

this 回答の助けを借りて、この場合に使用できる非常に基本的なScrollViewコンポーネントをまとめました。

ScrollViewを拡張するカスタムクラスを作成し、次の変更を行います。

public class MaxHeightScrollView extends ScrollView {

    private int maxHeight;

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

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

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

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

    private void init(Context context, AttributeSet attrs) {
        if (attrs != null) {
            TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
            maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, 200); //200 is a default value
            styledAttrs.recycle();
        }
    }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
       super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }
}

そして、マイナーなことの1つは、valuesフォルダーのattrs.xmlファイルでスタイル可能を宣言することです(これがない場合は、プロジェクトのresフォルダーのvaluesフォルダーにこの名前のxmlファイルを作成してください)。そこで次の行を追加します。

<declare-styleable name="MaxHeightScrollView">
    <attr name="maxHeight" format="dimension" />
</declare-styleable>

次のように新しいScrollViewを使用します。

<com.yourpackage.MaxHeightScrollView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:maxHeight="300dp">
</com.yourpackage.MaxHeightScrollView>

クレジットは whizzle に移動し、これをすばやくまとめます!

18
Mike

私の簡単な解決策。
XMLでScrollView heighを設定:

Android:layout_height="wrap_content"

現在の測定された高さが200より大きい場合、このコードを追加して最大高さを200に設定します

sv.measure(0, 0);
if (nsv.getMeasuredHeight() > 200) {
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                      ViewGroup.LayoutParams.MATCH_PARENT, 200);
        sv.setLayoutParams(lp);
}

私の例ではScrollViewLinearLayoutに含まれているため、LinearLayout.LayoutParamsを使用しました。

2
Volodymyr Kulyk

高さを固定してScrollViewの周りにレイアウトを追加します

0
Denys Lobur