2012-10-18 18 views
9

Điều tôi muốn là bố cục với 2 chế độ xem được sắp xếp theo chiều dọc. Chúng ta hãy gọi top view A và đáy B. Tôi muốn số lượng chiều cao cho B là chiều cao bình thường của nó (tức là nội dung bọc) ngoại trừ việc tôi không muốn nó được cho hơn một nửa không gian sẵn có. A nhận được những gì còn lại.chiều cao wrap_content, nhưng giới hạn một nửa số phụ huynh

Một cách khác để từ đó là A phải luôn nhận được ít nhất 50% chiều cao có sẵn và B sẽ nhận được tối đa 50%.

Tôi dường như không thể tìm được cách dễ dàng để đạt được điều đó. Tôi có thể thiết lập cả hai chiều cao bố trí 0 và cung cấp cho họ trọng lượng bằng nhau mà làm cho họ cả hai 50% luôn luôn, nhưng nếu B nhỏ hơn 50% nó sẽ được đưa ra chỉ những gì nó cần.

Cách duy nhất tôi có thể thấy để làm điều đó là sử dụng một lớp tùy chỉnh cho A hoặc B và ghi đè lênĐoạn để hạn chế chiều cao đến 50% của phụ huynh, nhưng có vẻ như có cách dễ dàng hơn.

+0

Vậy đầu vào để xác định B lớn như thế nào? Bạn có thể tạo bố cục động trong mã của mình ([Android Reference LayoutParams] (http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html)). – MarchingHome

+0

Đầu vào để xác định B lớn như thế nào là nội dung của B. B là bố cục (hiện là một đoạn) có chứa một số nội dung kích thước cố định nhưng phần lớn nó là một TextView có nội dung động. Có thể là một vài dòng văn bản hoặc một trang văn bản dài. Nếu văn bản trong B dài và B bị giới hạn ở 50% thì văn bản sẽ có thể cuộn được. –

+0

Bạn đã tìm cách xác định số lượng dòng văn bản trong B và tự động điều chỉnh độ cao của B theo điều đó chưa? – MarchingHome

Trả lời

-1

Tạo bố cục tuyến tính với hai khung bên trong, mỗi khung có trọng số .5. Bên trong các khung đó, đặt chế độ xem của bạn, đặt chúng thành wrap_content hoặc match_parent nếu thích hợp.

+0

Nhưng sau đó nội dung của A không thể vượt quá 50% hoặc có thể không? – MarchingHome

+1

@MarchingHome bạn nói đúng. Nó không thể vượt quá 50%. – Ahmad

+0

Không hoàn toàn đạt được điều đó. Cho phép một B nhỏ được mở rộng đến 50%. –

3

Ok, tôi đã nhận ngay bây giờ. Nếu tôi hiểu đúng bạn muốn có nó như thế này:

if A > B -> do nothing 
if B > A & B > parent layout -> 50% to both of them 
if B > A & B < parent layout -> A = parent layout - B 

tôi phải làm tất cả trong onWindowFocusChanged bởi vì nếu không trong onCreate chiều cao của Views sẽ trở về 0. Tôi đã làm điều đó với 2 LinearLayouts như bố trí trẻ em, nhưng bạn có thể làm những gì bạn muốn.

XML của tôi:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:id="@+id/parent_lay" 
    android:orientation="vertical" 
    android:layout_height="match_parent" > 

//Layout A: 
    <LinearLayout 
     android:id="@+id/lay_1" 
     android:layout_width="match_parent" 
     android:background="@android:color/background_dark" 
     android:layout_height="10dp" > 
    </LinearLayout> 
//Layout B: 
    <LinearLayout 
     android:id="@+id/lay_2" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:background="#123456" > 

    </LinearLayout> 

</LinearLayout> 

MainActivity:

public class MainActivity extends Activity { 
    LinearLayout parent_lay; 
    LinearLayout lay_1; 
    LinearLayout lay_2; 
    int parent_height; 
    int lay_1_height; 
    int lay_2_heigth; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     // TODO Auto-generated method stub 
     super.onWindowFocusChanged(hasFocus); 
     parent_lay = (LinearLayout) findViewById(R.id.parent_lay); 
     lay_1 = (LinearLayout) findViewById(R.id.lay_1); 
     lay_2 = (LinearLayout) findViewById(R.id.lay_2); 
     lay_1_height = lay_1.getHeight(); 
     lay_2_heigth = lay_2.getHeight(); 
     parent_height = parent_lay.getHeight(); 


     if (lay_2.getHeight() > lay_1.getHeight() 
       && lay_2.getHeight() > (parent_lay.getHeight()/2)) { 

      lay_1.setLayoutParams(new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, 0, 1)); 

      lay_2.setLayoutParams(new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, 0, 1)); 

     } else if (lay_2.getHeight() < (parent_lay.getHeight()/2)) { 
      lay_1.setLayoutParams(new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, (parent_height - lay_2_heigth))); 

     } 

    } 

} 

Ví dụ: Nếu A là 60dp và B là 40dp:

enter image description here

.210

Nếu A là 60dp và B là 400dp:

enter image description here

+1

Cảm ơn tất cả công việc đó, nhưng bạn không hoàn toàn có được các quy tắc đúng. B Luôn luôn là cha mẹ - A. Nếu chiều cao đo được của A là ít hơn một nửa của cha mẹ sử dụng, nếu không sử dụng một nửa của cha mẹ cho kích thước của A. –

+0

@dalewking Bạn nói "B nên nhận được nhiều nhất là 50%." - Vì vậy, không quá 50%, đây chính xác là những gì tôi đã làm. Trong ví dụ của tôi B * là * luôn luôn (cha mẹ - A), trừ khi nó nhiều hơn 50%, vì vậy cách tiếp cận tốt nhất sẽ là nếu chiều cao ban đầu của B lớn hơn 50%, nó sẽ có nhiều không gian nhất có thể (50%) . – Ahmad

+0

Rất tiếc trong câu trả lời của tôi, tôi đã đảo ngược A và B. A Luôn luôn là cha mẹ - B. Nếu chiều cao được đo của B ít hơn một nửa tỷ lệ sử dụng mẹ, nếu không, hãy sử dụng một nửa phụ huynh cho kích thước B. Thay đổi tập trung chắc chắn không phải là địa điểm để làm điều này, nhưng có những người nghe thay đổi bố cục. Sẽ thử với giải pháp của tôi tôi đã đề cập dưới đây và nếu điều đó không làm việc sẽ xem xét lại giải pháp của bạn. –

0

Bạn phải viết thành phần của riêng bạn để đạt được điều này.

Ví dụ: nếu bạn sử dụng LinearLayout tại đây, bạn có thể mở rộng LinearLayout bằng phương pháp OverMeasure quá mức. Bạn có thể triển khai onMeasure như thế này:

@Override 
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    final int width = getMeasuredWidth(); 
    final int height = getMeasuredHeight(); 
    setMeasuredDimension(width, height/2); 
} 

Mã này không đủ thanh lịch. Nếu bạn thực sự muốn thực hiện tốt, hãy sao chép phương thức onMeasure gốc từ mã nguồn Android (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/ android/widget/LinearLayout.java # LinearLayout.onMeasure% 28int% 2Cint% 29) và trong measureVertical(int widthMeasureSpec, int heightMeasureSpec), đặt mTotalLength = mTotalLength/2.

Để biết thông tin chi tiết về onMeasure, hãy truy cập http://developer.android.com/guide/topics/ui/custom-components.htmlhttp://developer.android.com/reference/android/view/View.html#onMeasure(int, int).

+0

Những gì bạn có ở đó sẽ làm cho một mục chiếm một nửa không gian nó thường sẽ mất, đó không phải là những gì tôi muốn. Tôi muốn nó chiếm một nửa không gian cha mẹ của nó, nhưng chỉ khi nó lớn hơn một nửa không gian cha mẹ của nó. Nếu nó nhỏ hơn, nó chỉ nên dùng phòng mà nó cần. –

Các vấn đề liên quan