Xem trước bố cục với thẻ gốc hợp nhất trong Intellij IDEA / Android Studio


157

Hãy tưởng tượng chúng ta đang phát triển thành phần hỗn hợp dựa trên linearLayout. Vì vậy, chúng tôi tạo ra lớp như thế này:

public class SomeView extends LinearLayout {
    public SomeView(Context context, AttributeSet attrs) {
        super(context, attrs);

        setOrientation(LinearLayout.VERTICAL);
        View.inflate(context, R.layout.somelayout, this);
    }
}

Nếu chúng tôi sử dụng LinearLayoutlàm gốc của somelayout.xml, chúng tôi sẽ có thêm cấp độ xem, vì vậy chúng tôi sử dụng thẻ hợp nhất:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some other text"/>
</merge>

Nhưng trong tab Xem trước trong hợp nhất IDE luôn hoạt động như FrameLayout và chúng ta sẽ thấy một cái gì đó như thế: Xem trước với hợp nhất

(Đó là Android Studio, Intellij IDEA cũng giống như vậy, về Eclipse tôi không biết)

Xem trước tăng tốc độ phát triển bố cục rất nhiều, thật đáng buồn khi mất một sự trợ giúp tuyệt vời như vậy ngay cả đối với một số bố cục. Có thể có một cách để xác định, làm thế nào Xem trước nên diễn giải mergethẻ trong bố cục cụ thể?


1
Tôi cũng muốn thấy hỗ trợ này được thêm vào.
Christopher Perry

Điều này có thể được giải quyết một thời gian trong tương lai bởi thuộc tính công cụ. code.google.com/p/android/issues/detail?id=61652
Jonas

Câu trả lời:


351

Có một thuộc tính công cụ ParentTag mới ( được thêm vào trong Android Studio 2.2 ) mà bạn có thể sử dụng để chỉ định loại bố cục cho thẻ hợp nhất, điều này sẽ làm cho bố cục hiển thị chính xác trong bản xem trước của trình chỉnh sửa bố cục.

Vì vậy, sử dụng ví dụ của bạn:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:parentTag="LinearLayout"
    tools:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="20sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some other text"/>
</merge>

Lưu ý : Cả hai android:layout_widthandroid:layout_heightphải được chỉ định để bố cục hiển thị đúng trong trình chỉnh sửa.


Có ai biết cách hiển thị bản xem trước một cách chính xác khi bạn thêm thẻ xem tùy chỉnh của mình vào một tệp bố cục khác không? <com.yourpackage.yourcustomview id="@+id/my_cust_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Arst


2
Vì bạn đang sử dụng các công cụ, bạn cũng có thể sử dụng các công cụ: layout_height = "match_parent"
cutiko

Hoàn hảo! Cảm ơn. +1
Carson J.

66

Chỉnh sửa: Câu trả lời lỗi thời. Xem câu trả lời của starkej2.


Android Studio 0.5.8 hỗ trợ thêm cho các công cụ: showIn. Bằng cách sử dụng nó, có thể xem trước bố cục <merge>.

http://tools.android.com/recent/androidstudio058 phát hành

layout / layout_merge.xml với các công cụ: showIn:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   tools:showIn="@layout/simple_relativelayout">

......

</merge>

layout / simple_relat khóayoutout.xml bao gồm:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/layout_merge"/>

</RelativeLayout>

13
Tin tốt! Không thuận tiện cho các thành phần ghép, bởi vì chúng ta cần thêm bố cục bổ sung để xem trước. Nhưng tốt hơn là không có gì.
darja

Bất kỳ ý tưởng về một cái gì đó tương tự được hỗ trợ trong Eclipse?
Toguard

3
Bạn có thể theo dõi một vé, được báo cáo bởi một nhà phát triển google tại đây: code.google.com/p/android/issues/detail?id=61652
Neige

Tôi đặt một số thuộc tính cho chế độ xem gốc (trong trường hợp này là RelativeLayout) theo chương trình, như phần đệm. Tất nhiên chúng không được áp dụng trong bố trí người trợ giúp này (vì bạn sử dụng chế độ xem hoàn toàn khác). Giải pháp duy nhất là sử dụng toàn bộ chế độ xem tùy chỉnh trong bố trí của trình trợ giúp.
Felix Edelmann

không bị lỗi thời, nó có thể được sử dụng khi bạn không muốn xem chung
amorenew

-5

Cũng có thể sử dụng lớp tùy chỉnh làm cha mẹ thay vì hợp nhất như

<com.mycompany.SomeView xmlns:android="http://schemas.android.com/apk/res/android">
...
</com.mycompany.SomeView>

Và sau đó trực tiếp làm tăng bố cục này và xem kết quả SomeView. Android studio sẽ trực tiếp kiểm tra lớp cha mẹ SomeViewvà xử lý xem trước như thế nào LinerLayout. Bạn có thể sử dụng onFinishInflate()phương thức trong các SomeViewliên kết để xem findViewById(). Lợi ích của giải pháp này là bạn có thể đặt tất cả các định nghĩa bố cục hoặc định nghĩa kiểu trực tiếp vào tệp bố cục, bạn không thể sử dụng phương thức như setOrientation()trong mã.


2
Điều này giới thiệu một đệ quy vô hạn và ngăn xếp tràn ra khi cố gắng xem trước, làm cho toàn bộ Android Studio bị treo mãi mãi.
mato
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.