2013-07-16 34 views
6

Tôi đang gặp rất nhiều sự cố khi cố gắng giải quyết vấn đề có vùng có thể cuộn chiều cao tĩnh trong bố cục. Tôi có ba danh sách dài cần được hiển thị trên cùng một màn hình và hoàn toàn không thực tế để hiển thị tất cả các mục tuần tự vì sau đó nếu bạn muốn bỏ qua một danh mục bạn cần phải cuộn qua hàng trăm mục nhập.Android ScrollView đặt chiều cao cho nội dung được hiển thị

Giả sử tôi có chế độ xem cuộn với Bố cục tuyến tính bên trong, tôi muốn nói lên, chiều cao 250dp trên màn hình ở mức tối đa và có thể cuộn độc lập khi có nhiều mục nhập hơn có thể vừa với không gian 250dp.

Những gì tôi có bây giờ là:

    <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> 

Khi dân cư, các scrollview và LinearLayout chỉ kéo dài chừng nào họ cần phải để phù hợp với nội dung và hiển thị tất cả của nó thay của việc có một "cửa sổ" 250dp/px (bất kỳ phép đo nào sẽ tốt đẹp) với nội dung có thể cuộn trong đó.

Tôi mới làm quen với nền tảng Android, vì vậy có lẽ câu trả lời là hiển nhiên và tôi không hiểu ngôn ngữ, nhưng mọi trợ giúp sẽ được đánh giá cao! Cảm ơn bạn

--- SOLVED: Đặt tuyến tínhThanh toán bên ngoài ScrollView với chiều cao.

Trả lời

1

Điều bạn cần là maxHeight. Nhưng vì lượt xem không hỗ trợ nó, bạn phải sử dụng giải pháp thay thế.

Kiểm tra câu trả lời này:

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

+0

tôi có phần kích thước để làm việc với bài viết của bạn, nhưng bây giờ khu vực đó không được di chuyển. Tôi đã cập nhật câu hỏi bằng mã mới. Cảm ơn bạn rất nhiều! – user2150445

+0

Thật kỳ lạ, tôi vừa chạy một mẫu và nó cuộn tốt, đây là cách bố trí: http://pastebin.com/raw.php?i=R45Z7wBi – Androiderson

+0

@ExceptionAl trang web pasteBin cho biết "Đã dán nhãn này!" –

9

Với một số sự giúp đỡ từ this câu trả lời tôi quản lý để quấn lên một thành phần scrollview rất cơ bản bạn có thể sử dụng cho trường hợp này:

Tạo một lớp tùy chỉnh mở rộng một ScrollView và thực hiện các sửa đổi sau:

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 defualt value 
      styledAttrs.recycle(); 
     } 
    } 

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

Và sau đó, một điều nhỏ nhặt bên trái là khai báo kiểu dáng của bạn trong tệp attrs.xml của thư mục giá trị của bạn (Nếu bạn không có, chỉ cần tạo tệp xml có tên này trong thư mục giá trị của thư mục res của dự án). Thêm các dòng sau đó:

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

Và sử dụng scrollview mới của bạn như sau:

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

Tín đi đến whizzle để nhanh chóng gói này lên!

1

Giải pháp đơn giản của tôi.
Set ScrollView heigh trong xml:

android:layout_height="wrap_content" 

Thêm mã này để thiết lập Max Height là 200 nếu Chiều cao đo được hiện nay là> 200

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

ScrollView trong ví dụ của tôi là vào LinearLayout, vì vậy Tôi đã sử dụng LinearLayout.LayoutParams.

+0

Cảm ơn bạn rất nhiều, đây chỉ là những gì tôi đang tìm kiếm. – RobertoAllende

2

Nếu tôi không nhầm, chiều cao của ViewGroup (chiều cao của LinearLayout trong trường hợp của bạn), đó là con (chỉ) bên trong ScrollView, luôn được hiểu là wrap_content, vì nội dung đó có thể lớn hơn chiều cao của ScrollView (do đó các thanh cuộn).

Điều này cũng có nghĩa là nếu nội dung nhỏ hơn, nội dung của ScrollView (con) có thể không nhất thiết phải kéo dài để lấp đầy màn hình.

Để giúp bạn khắc phục sự cố này một cách trực quan, chúng tôi cần xem ảnh chụp màn hình sự cố của bạn.

Có lẽ thiết android:fillViewport="true" trên ScrollView sẽ khắc phục vấn đề của bạn:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scrollView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true">