Ký quỹ FrameLayout không hoạt động


79

Cấu trúc bố cục của tôi như thế này

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

Tôi đã đặt lề cho hai ImageView bên trong FrameLayout. Nhưng lề FrameLayout bị loại bỏ và nó luôn đặt Hình ảnh ở góc trên cùng bên trái. Nếu tôi thay đổi từ FrameLayout sang LinearLayout thì ký quỹ hoạt động bình thường. Làm thế nào để xử lý điều này?

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/inner1"
    >
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
        >

            <ImageView
             android:layout_width="24px" 
             android:layout_height="24px" 
             android:id="@+id/favicon"
             android:layout_marginLeft="50px"
             android:layout_marginTop="50px"
             android:layout_marginBottom="40px"
             android:layout_marginRight="70px"      

            />      
            <ImageView
             android:layout_width="52px" 
             android:layout_height="52px" 
             android:id="@+id/applefavicon" 
             android:layout_marginLeft="100px"
             android:layout_marginTop="100px"
             android:layout_marginBottom="100px"
             android:layout_marginRight="100px"              
            />

        </FrameLayout>  
            <TextView
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:id="@+id/title"                 
            android:layout_marginLeft="10px"        
            android:layout_marginTop="20px"
            android:textColor="#FFFFFF"  
            android:textSize = "15px"
            android:singleLine = "true"
            />

    </LinearLayout>

Câu trả lời:


221

Tôi đã cùng một vấn đề bản thân mình và nhận thấy rằng việc thiết lập layout_lề không làm việc cho đến khi bạn cũng thiết lập tức bố trí lực hấp dẫn của ImageView của bạn android:layout_gravity="top"trong tập tin tài nguyên XML, hoặc từ mã: FrameLayout.LayoutParams.gravity = Gravity.TOP;.


21
Nó hoạt động, nhưng nó làm cho tôi cảm thấy bẩn. Tôi nghĩ mình đã trốn thoát những ngày của hacks CSS ...
erlando

1
FrameLayout.LayoutParams.gravity không có một lựa chọn hấp dẫn trong 2.3
JPM

2
Nó dường như được sửa trên 4.1 (có thể là trước đó). Hữu ích để biết mặc dù
pablisco

đã khắc phục sự cố tôi đang gặp phải trên ngọn lửa kindle cũ. Cảm ơn!
DallinDyer

12
Để làm rõ hơn lý do tại sao. Lệnh gọi FrameLayout.onLayout () chứa điều này (ít nhất là trong api v2.3.4): // for each child: final LayoutParams lp = (LayoutParams) child.getLayoutParams(); final int gravity = lp.gravity; if (gravity != -1) { // handle all margin related stuff Vì vậy, nếu trọng lực là -1, sẽ không có tính toán ký quỹ. Gravity trong FrameLayout.LayoutParams được định nghĩa bởi: gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1); Vì vậy, nếu trọng lực không được đặt, sẽ không có tính toán lợi nhuận.
Miklos Jakab 23/09/13

8

Để làm rõ hơn lý do tại sao. Lệnh gọi FrameLayout.onLayout () chứa điều này (ít nhất là trong api v2.3.4):

    // for each child
    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
    final int gravity = lp.gravity;
    if (gravity != -1) {
        // handle all margin related stuff

Vì vậy, nếu trọng lực là -1, sẽ không có tính toán biên. Và vấn đề là, lực hấp dẫn trong FrameLayout.LayoutParams được định nghĩa bởi:

    gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);

Vì vậy, nếu trọng lực không được thiết lập, sẽ không có tính toán lợi nhuận.


7

thêm xml của bạn thuộc tính này và chạy lại

android: layout_gravity = "top"

tất cả mọi thứ đều ổn cả!

và bạn không đặt các thông số bố cục mới như thế này;

FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(WallpapersActivity.ScreenWidth/2, layH);

sử dụng như thế này:

FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams();
llp.height = 100;
llp.width = 100;
myFrameLay.setLayoutParams(llp);

1
Vì vậy, nếu bạn không có LayoutParams, nó sẽ bị lỗi với phương pháp thứ hai.
Léon Pelletier

bạn có thể kiểm tra nó với if == null control.
Savas Adar

Đây giải quyết vấn đề của tôi với margin_top trên Android 10
Pedro Paulo Amorim

1

Lấy từ tài liệu FrameLayout ( liên kết )

Kích thước của bố cục khung là kích thước của con lớn nhất của nó (cộng với phần đệm), có thể nhìn thấy hoặc không (nếu cha mẹ của FrameLayout cho phép).

Điều này dường như mô tả thực tế rằng nó sẽ loại bỏ lợi nhuận. Giống như boulder đã đề cập, bạn có thể thử chuyển sang padding vì nó có thể được sử dụng để tạo ra hiệu ứng tương tự nếu được thực hiện đúng cách.

Vì tò mò, bạn đã đề cập rằng nó hoạt động tốt khi sử dụng một vùng LinearLayoutchứa, tại sao lại chọn FrameLayout?


0

Bạn đã thử android: layout_gravity chưa? Hãy thử sử dụng android: padding trong ImageViews thay vì android: layout_margin. Lề AFAIK không hoạt động bình thường trên Bố cục khung. Tôi thậm chí đã phải viết bố cục tùy chỉnh cho mục đích đó một lần. BTW, bạn muốn gán ImageView cho mình như thế nào?


không có trọng lượng trong một framelayout
njzk2

0

hãy thử setCropToPadding (true) thành ImageView, điều này sẽ được giúp đỡ!


0

bạn phải đặt trọng lực bố cục của ImageView lên trên cùng, tức là android: layout_gravity = "top" trong tệp tài nguyên XML hoặc từ mã: FrameLayout.LayoutParams.gravity = Gravity.TOP

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.