Sự khác biệt giữa ConstraintLayout và RelativeLayout


219

Tôi bối rối về sự khác biệt giữa ConstraintLayoutRelativeLayout. Ai đó có thể vui lòng cho tôi biết sự khác biệt chính xác giữa họ?


9
ConstraintLayout được thiết kế chủ yếu cho các lập trình viên mới để họ có thể dễ dàng thiết kế bố cục bằng Visual Editor thay vì xây dựng bố cục bằng tay thông qua XML.
CopsOnRoad

1
@Jack chắc chắn nó cũng có mục đích sâu xa hơn cho các nhà phát triển chuyên gia dày dạn
Moses Aprico

@MosesAprico bạn đúng nó có cái đó. Nhưng tôi nghĩ rằng chuyên gia dày dạn devs đã có rất nhiều cách khác (họ đã biết như RealtiveLayout, LinearLayout, GridLayoutvv) để có được hệ thống phân cấp xem họ muốn.
CopsOnRoad

5
@CopsOnRoad Thật ra bạn đã sai. Apple đã thực hiện các bố cục hạn chế trong hơn 5 năm. Bạn nhận được thiết kế đáp ứng với mọi kích thước và không phải viết một tấn bố cục phức tạp. Khi bạn bắt đầu ràng buộc nhiều chế độ xem, bạn chỉ cần 3 điều khiển cơ bản để tạo ra thiết kế đáp ứng đầy đủ.
Nick Turner

Câu trả lời:


145

Ý định ConstraintLayoutlà để tối ưu hóa và làm phẳng hệ thống phân cấp chế độ xem của bố cục của bạn bằng cách áp dụng một số quy tắc cho mỗi chế độ xem để tránh lồng nhau.

Các quy tắc nhắc nhở bạn RelativeLayout, ví dụ như đặt bên trái sang bên trái của một số chế độ xem khác.

app:layout_constraintBottom_toBottomOf="@+id/view1"

Không giống như RelativeLayout, ConstraintLayoutcung cấp biasgiá trị được sử dụng để định vị chế độ xem theo tỷ lệ 0% và bù ngang và dọc 100% so với tay cầm (được đánh dấu bằng vòng tròn). Các tỷ lệ phần trăm (và phân số) này cung cấp định vị liền mạch của chế độ xem trên các mật độ và kích thước màn hình khác nhau.

app:layout_constraintHorizontal_bias="0.33" <!-- from 0.0 to 1.0 -->
app:layout_constraintVertical_bias="0.53" <!-- from 0.0 to 1.0 -->

Tay cầm cơ sở (ống dài với các góc tròn, bên dưới tay cầm hình tròn) được sử dụng để căn chỉnh nội dung của chế độ xem với tham chiếu chế độ xem khác.

Tay cầm vuông (trên mỗi góc của khung nhìn) được sử dụng để thay đổi kích thước khung nhìn trong dps.

nhập mô tả hình ảnh ở đây

Đây hoàn toàn là ý kiến ​​dựa trên và ấn tượng của tôi về ConstraintLayout


9
Chúng ta vẫn có thể tạo bố cục làm phẳng bằng RelativeLayout, đó là lý do tại sao tôi bối rối khi ConstraintLayout chăm sóc nơi RelativeLayout không thể?

6
RelativeLayout là một bố cục hai vượt qua, chịu thuế gấp đôi. Nó phải đo / bố trí ít nhất hai lần. ConstraintLayout không phải chịu hình phạt hiệu suất này.
Christopher Perry

5
@Nellow Yep, chúng ta vẫn có thể tạo bố cục làm phẳng bằng RelativeLayout. Nhưng ngoài tất cả mọi người được đề cập ở đây, ConstraintLayout cho phép bạn sử dụng tỷ lệ lợi nhuận âmtỷ lệ phỏng vấn theo tỷ lệ được xác định trước . Cuối cùng là cách mạnh mẽ nhất để giữ tỷ lệ 16: 9 cho ImageView của bạn trong CardView theo thiết kế Vật liệu
Eugene Brusov

4
Có một số bố cục không thể có trong RelativeLayout trừ khi bạn lồng một linearLayout hoặc RelativeLayout khác. Ví dụ: căn giữa một "ngăn xếp" gồm 3 Chế độ xem theo chiều dọc so với Chế độ xem khác
Gak2

@ Gak2 Tôi không thể thấy bất cứ điều gì không thể trong ví dụ của bạn mà không có bố cục lồng nhau. Có lẽ bạn có ý gì khác với "stack" hơn tôi. Tôi chỉ sử dụng "layout_alignEnd", "layout_below", "layout _..." và có thể xây dựng bất kỳ loại ngăn xếp nào với nó ...
Ngày

81

Thuộc tính tương đối Bố cục và ràng buộc Bố cục tương đương

Thuộc tính tương đối Bố cục và ràng buộc Bố cục tương đương

(1) Bố cục tương đối:

android:layout_centerInParent="true"    

(1) Bố cục ràng buộc tương đương:

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"

(2) Bố cục tương đối:

android:layout_centerHorizontal="true"

(2) Bố cục ràng buộc tương đương:

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"

(3) Bố cục tương đối:

android:layout_centerVertical="true"    

(3) Bố cục ràng buộc tương đương:

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"

(4) Bố cục tương đối:

android:layout_alignParentLeft="true"   

(4) Bố cục ràng buộc tương đương:

app:layout_constraintLeft_toLeftOf="parent"

(5) Bố cục tương đối:

android:layout_alignParentStart="true"

(5) Bố cục ràng buộc tương đương:

app:layout_constraintStart_toStartOf="parent"

(6) Bố cục tương đối:

android:layout_alignParentRight="true"

(6) Bố cục ràng buộc tương đương:

app:layout_constraintRight_toRightOf="parent"

(7) Bố cục tương đối:

android:layout_alignParentEnd="true"    

(7) Bố cục ràng buộc tương đương:

app:layout_constraintEnd_toEndOf="parent"

(8) Bố cục tương đối:

android:layout_alignParentTop="true"

(8) Bố cục ràng buộc tương đương:

app:layout_constraintTop_toTopOf="parent"

(9) Bố cục tương đối:

android:layout_alignParentBottom="true" 

(9) Bố cục ràng buộc tương đương:

app:layout_constraintBottom_toBottomOf="parent"

(10) Bố cục tương đối:

android:layout_alignStart="@id/view"

(10) Bố cục ràng buộc tương đương:

app:layout_constraintStart_toStartOf="@id/view"

(11) Bố cục tương đối:

android:layout_alignLeft="@id/view" 

(11) Bố cục ràng buộc tương đương:

app:layout_constraintLeft_toLeftOf="@id/view"

(12) Bố cục tương đối:

android:layout_alignEnd="@id/view"  

(12) Bố cục ràng buộc tương đương:

app:layout_constraintEnd_toEndOf="@id/view"

(13) Bố cục tương đối:

android:layout_alignRight="@id/view"

(13) Bố cục ràng buộc tương đương:

app:layout_constraintRight_toRightOf="@id/view"

(14) Bố cục tương đối:

android:layout_alignTop="@id/view"  

(14) Bố cục ràng buộc tương đương:

app:layout_constraintTop_toTopOf="@id/view"

(15) Bố cục tương đối:

android:layout_alignBaseline="@id/view" 

(15) Bố cục ràng buộc tương đương:

app:layout_constraintBaseline_toBaselineOf="@id/view"

(16) Bố cục tương đối:

android:layout_alignBottom="@id/view"

(16) Bố cục ràng buộc tương đương:

app:layout_constraintBottom_toBottomOf="@id/view"

(17) Bố cục tương đối:

android:layout_toStartOf="@id/view"

(17) Bố cục ràng buộc tương đương:

app:layout_constraintEnd_toStartOf="@id/view"

(18) Bố cục tương đối:

android:layout_toLeftOf="@id/view"  

(18) Bố cục ràng buộc tương đương:

app:layout_constraintRight_toLeftOf="@id/view"

(19) Bố cục tương đối:

android:layout_toEndOf="@id/view"

(19) Bố cục ràng buộc tương đương:

app:layout_constraintStart_toEndOf="@id/view"

(20) Bố cục tương đối:

android:layout_toRightOf="@id/view"

(20) Bố cục ràng buộc tương đương:

app:layout_constraintLeft_toRightOf="@id/view"

(21) Bố cục tương đối:

android:layout_above="@id/view" 

(21) Bố cục ràng buộc tương đương:

app:layout_constraintBottom_toTopOf="@id/view"

(22) Bố cục tương đối:

android:layout_below="@id/view" 

(22) Bố cục ràng buộc tương đương:

app:layout_constraintTop_toBottomOf="@id/view"


2
Bạn có thể đăng dưới dạng văn bản thay vì hình ảnh? Vì vậy, nó sẽ rất hữu ích cho tôi và những người khác trong tương lai.
Nhà phát triển mới

2
Mọi người bắt đầu tìm hiểu Bố cục ràng buộc cần phải thấy điều này. Cảm ơn.
trợ

1
Đây là thông tin hữu ích, nhưng chỉ đơn giản là một bãi chứa tài liệu và không làm gì để giải thích sự khác biệt giữa chúng.
YetAnotherRandomUser

1
Không, tôi không có thời gian để xem tài liệu, điều này chắc chắn hữu ích. Và được viết bằng ngôn ngữ đơn giản. Nâng cao.
CodeToLife

46

Báo cáo bởi @davidpbr ConstraintLayout hiệu suất

Tôi đã thực hiện hai bố cục 7 đứa trẻ tương tự nhau, mỗi bố cục có một phụ huynh ConstraintLayoutRelativeLayout. Dựa trên công cụ theo dõi phương thức Android Studio, nó xuất hiện ConstraintLayoutdành nhiều thời gian hơn cho onMeasure và thực hiện công việc bổ sung trongonFinishInflate .

Thư viện được sử dụng ( support-v4, đào appcompat-v7):

com.android.support.constraint:constraint-layout:1.0.0-alpha1

Các phiên bản thiết bị / Android được sao chép trên: Samsung Galaxy S6 (SM-G920A. Xin lỗi, không có máy atm Nexus). Android 5.0.2

So sánh phương pháp nhanh:

1

Mẫu repo Github: https://github.com/OnlyInAmerica/ConstraintLayoutPerf


từ cùng một vấn đề: Bây giờ tôi sẽ đóng cái này - alpha 4/5 mang lại khá nhiều cải tiến về hiệu suất. Có lẽ chúng tôi sẽ có thể cải thiện nó nhiều hơn, nhưng điều đó có thể đợi bài 1.0.
Oleksandr

Bạn có thể giải thích về công cụ nào bạn đã sử dụng để tạo ra sự so sánh tuyệt vời này không?
Nativ

2
@Nativ Monotirs-> CPU-> Biểu tượng theo dõi thời gian
Andrey T

18
Chạy và định hình cùng mã với bố cục ràng buộc: 1.0.1 trên Nexus 5 với Android 6.0.1, ở đây kết quả: Bố cục tương đối - init 2ms trên Biện pháp 30ms + 16ms = 62ms trên Layouyt 7ms = 9ms Tổng cộng 54 ms Bố cục ràng buộc - init Bố cục ràng buộc 7ms Tạo tham số bố cục + thêm chế độ xem ~ 7 * 2ms = 14ms Trên Biện pháp 60ms + 52ms ~ 112ms Trên Bố cục Tổng cộng 8ms ~ 141ms Khởi tạo lần đầu của Bố cục tương đối nhanh hơn gần ba lần so với Hạn chế.
Andrey T

2
Bố cục ràng buộc được giới thiệu để có thể giảm thứ bậc khung nhìn lồng nhau. Vì vậy, phân cấp ít hơn có nghĩa là ít thời gian hơn để di chuyển từ trên xuống dưới trong cây xem. Vì vậy, Điểm nào để tạo một hệ thống phân cấp khung nhìn lồng nhau có thể không cần thiết trong bố cục ràng buộc và so sánh nó với Bố cục tương đối mà bạn có nhiều cơ hội kết thúc với cấu trúc lồng nhau?
codepeaker

27

Sau đây là những khác biệt / lợi thế:

  1. Bố cục ràng buộc có sức mạnh kép của cả Bố cục tương đối cũng như Bố cục tuyến tính: Đặt vị trí tương đối của chế độ xem (như Bố cục tương đối) và cũng đặt trọng số cho Giao diện người dùng động (chỉ có thể có trong Bố cục tuyến tính).

  2. Một cách sử dụng rất mạnh mẽ là nhóm các yếu tố bằng cách tạo thành một chuỗi. Bằng cách này, chúng ta có thể tạo thành một nhóm các khung nhìn mà toàn bộ có thể được đặt theo một cách mong muốn mà không cần thêm một lớp phân cấp khác chỉ để tạo thành một nhóm các khung nhìn khác.

  3. Ngoài các trọng số, chúng ta có thể áp dụng độ lệch ngang và dọc, không gì khác ngoài tỷ lệ phần trăm dịch chuyển từ tâm. (độ lệch 0,5 có nghĩa là căn chỉnh tập trung. Mọi giá trị nhỏ hơn hoặc nhiều hơn có nghĩa là chuyển động tương ứng theo hướng tương ứng).

  4. Một tính năng rất quan trọng khác là nó tôn trọng và cung cấp chức năng xử lý các chế độ xem Gone để bố cục không bị phá vỡ nếu một số chế độ xem được đặt thành Gone thông qua mã java. Có thể tìm thấy nhiều hơn ở đây: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior

  5. Cung cấp sức mạnh của ràng buộc tự động khi áp dụng bằng cách sử dụng công cụ In màu xanh và Visual Editor giúp dễ dàng thiết kế trang.

Tất cả các tính năng này dẫn đến việc làm phẳng hệ thống phân cấp chế độ xem giúp cải thiện hiệu suất và cũng giúp tạo giao diện người dùng linh hoạt và nhạy bén, có thể dễ dàng thích ứng với kích thước và mật độ màn hình khác nhau.

Đây là nơi tốt nhất để tìm hiểu nhanh: https://codelabs.developers.google.com/codelabs/constraint-layout/#0


6) ConstraintLayout cho phép tăng kích thước các lượt xem trong các tỷ lệ được xác định trước Medium.com/google-developers/ . Ví dụ, nó hữu ích khi bạn giữ ImageView của mình ở 16: 9.
Eugene Brusov

15

Một sự khác biệt lớn là ConstraintLayout tôn trọng các ràng buộc ngay cả khi chế độ xem không còn nữa. Vì vậy, nó sẽ không phá vỡ bố cục nếu bạn có một chuỗi và bạn muốn làm cho một khung nhìn biến mất ở giữa.


bạn có thể cho tôi ví dụ nào không? giả sử có 3 nút ở đó Tôi sẽ ẩn nút thứ 2 và nút thứ 3 được gắn vào nút thứ 2 với id là btn2. Giả sử tôi ẩn nút thứ 2 thì làm sao nút thứ 3 có thể tìm thấy id của nút thứ 2?

1
Đo không phải sự thật. Nếu bạn đặt mức độ hiển thị của Nút là "BÍ MẬT" thay vì "ĐÁNH GIÁ", bạn sẽ không phá vỡ các ràng buộc. Đối với tôi, điểm khác biệt lớn nhất như @Nikola đã nói là sự thiên vị giúp bạn tạo ra nhiều lượt xem "Phản hồi" hơn.
zapotec

@Nellow Hãy giả sử rằng các nút nằm dưới nhau. Ngay cả khi bạn ẩn tButton 2, nó vẫn ở đó trong "hợp đồng xem", trong xml hoặc mã của bạn. ConstraintLayout sẽ tôn trọng nó và Nút 3 sẽ nằm dưới Nút 1. Trong RelativeLayout Nút 2 không còn nữa, phần chống lại sẽ biến mất, do đó, Nút 3 sẽ ở vị trí mặc định, do đó, phía trên bên trái màn hình.
Herrbert74

@zapotec Tôi tôn trọng những thứ khác quan trọng hơn với bạn, nhưng đối với tôi đây là một sự khác biệt thực sự tuyệt vời. Sửa điều duy nhất tôi ghét trong RelativeLayout. Sử dụng vô hình không phải là một lựa chọn, bởi vì nó sẽ yêu cầu không gian.
Herrbert74

7

Ngoài câu trả lời @ dhaval-jivani.

Tôi đã cập nhật dự án github của dự án lên phiên bản mới nhất của bố cục ràng buộc v.1.1.0-beta3

Tôi đã đo và so sánh thời gian của phương thức onCreate và thời gian giữa lúc bắt đầu onCreate và kết thúc thực hiện phương thức preformDraw cuối cùng có thể nhìn thấy trong màn hình CPU. Tất cả các thử nghiệm đã được thực hiện trên Samsung S5 mini với Android 6.0.1 Tại đây, kết quả:

Khởi đầu mới (mở màn hình đầu tiên sau khi khởi chạy ứng dụng)

Giao diện tương đối

OnCreate: 123ms

Lần preformDraw thời gian cuối - Thời gian OnCreate: 311.3ms

Bố cục hạn chế

OnCreate: 120,3ms

Thời gian preformDraw cuối cùng - Thời gian OnCreate: 310ms

Ngoài ra, tôi đã kiểm tra kiểm tra hiệu năng từ bài viết này , ở đây mã và thấy rằng trên vòng lặp đếm ít hơn 100 biến thể bố cục ràng buộc nhanh hơn trong khi thực hiện lạm phát, đo lường và bố cục sau đó biến thể với Bố cục tương đối. Và trên các thiết bị Android cũ, như Samsung S3 với Android 4.3, sự khác biệt lớn hơn.

Để kết luận, tôi đồng ý với ý kiến ​​từ bài viết :

Có đáng để cấu trúc lại các khung nhìn cũ chuyển sang nó từ RelativeLayout hoặc linearLayout không?

Như mọi khi: Nó phụ thuộc

Tôi sẽ không cấu trúc lại bất cứ thứ gì trừ khi bạn gặp vấn đề về hiệu năng với hệ thống phân cấp bố cục hiện tại hoặc bạn muốn thực hiện các thay đổi quan trọng đối với bố cục. Mặc dù tôi đã không đo nó gần đây, tôi không tìm thấy bất kỳ vấn đề hiệu suất nào trong các phiên bản trước. Vì vậy, tôi nghĩ rằng bạn nên an toàn để sử dụng nó. nhưng - như tôi đã nói - đừng chỉ di cư vì mục đích di chuyển. Chỉ làm như vậy, nếu có nhu cầu và hưởng lợi từ nó. Tuy nhiên, đối với các bố cục mới, tôi hầu như luôn sử dụng ConstraintLayout. Nó tốt hơn nhiều so với những gì chúng ta có trước đây.


6

Chính thức, ConstraintLayoutnhanh hơn nhiều

Trong bản phát hành N của Android, ConstraintLayoutlớp cung cấp chức năng tương tự RelativeLayout, nhưng với chi phí thấp hơn đáng kể.


6

Câu hỏi thực sự cần đặt ra là, có lý do nào để sử dụng bất kỳ bố cục nào ngoài bố cục ràng buộc không? Tôi tin rằng câu trả lời có thể là không.

Đối với những người khăng khăng họ nhắm vào các lập trình viên mới làm quen hoặc tương tự, họ nên cung cấp một số lý do để họ thua kém bất kỳ bố cục nào khác.

Bố cục ràng buộc tốt hơn về mọi mặt (Chúng có giá như 150k trong kích thước APK.). Chúng nhanh hơn, dễ dàng hơn, linh hoạt hơn, chúng phản ứng tốt hơn với các thay đổi, chúng khắc phục các sự cố khi vật phẩm biến mất, chúng phù hợp hơn với các loại màn hình khác nhau và chúng không sử dụng một vòng lặp lồng nhau với thời gian dài như vậy vẽ ra cấu trúc cây cho mọi thứ. Bạn có thể đặt mọi thứ ở mọi nơi, đối với mọi thứ, mọi nơi.

Chúng đã hơi trở lại vào giữa năm 2016, trong đó trình soạn thảo bố cục hình ảnh không đủ tốt, nhưng chúng đến mức nếu bạn đang có một bố cục, bạn có thể muốn xem xét nghiêm túc việc sử dụng bố cục ràng buộc, thậm chí khi nó làm điều tương tự như một RelativeLayout , hoặc thậm chí là đơn giản LinearLayout. FrameLayoutsrõ ràng vẫn có mục đích của họ. Nhưng, tôi không thể thấy việc xây dựng bất cứ thứ gì khác vào thời điểm này. Nếu họ bắt đầu với điều này, họ sẽ không thêm bất cứ điều gì khác.


1
Có bằng chứng nào nhanh hơn không?
Rajesh Nasit

1
Đúng. Nó nhanh hơn. Bố cục nằm xuống trong một bộ giải duy nhất thay vì lặp qua một cái cây. Đối với hầu hết mọi thứ, điều đó sẽ không quan trọng bởi vì nó được thực hiện trong cuộc gọi đến bố cục. Tuy nhiên, cây điều xem dễ dàng, tạo ra một loạt các khung nhìn bên trong các khung nhìn yêu cầu các cuộc gọi yêu cầu các cuộc gọi. Mặc dù về mặt lý thuyết nó đẹp hơn, trong thực tế, việc thực hiện bố cục trong một bit mã dễ dàng hơn nhiều so với việc lặp qua toàn bộ cây xem. Nó sẽ trở nên ấn tượng hơn với nhiều lượt xem hơn nhưng đây là điểm chuẩn từ tháng 5: Medium.com/@krpiotrek/constraintlayout-performance-c1455c7984d7
Tatarize 6/11/2017

Tôi đang đối mặt với một câu hỏi khác, tôi có nên thay thế tất cả các Relat Xoayayout hiện có trong ứng dụng tôi đang làm việc không? Nó sẽ cải thiện đáng kể hiệu suất?
Saletanth Karumanaghat 25/03/19

@SaletanthKarumanaghat có vẻ như bạn sẽ không bao giờ lấy lại được thời gian cần thiết để thay thế những người quay lại trong thời gian chuyển đổi sẽ giúp bạn tiết kiệm. Trong hầu hết các trường hợp, chúng ta đang nói về chu kỳ 3,5ms giảm xuống còn 3,25ms. Nếu nó cung cấp cho bạn một tính năng bổ sung hoặc một cái gì đó bạn cần thì chắc chắn, nhưng hoàn toàn là trên cơ sở tốc độ nah. Mặc dù chúng ta đang nói nhấn một nút chuyển đổi.
Tatarize

5

Kết luận tôi có thể đưa ra là

1) Chúng tôi có thể thiết kế giao diện người dùng mà không cần chạm vào phầnxml , thành thật mà nói tôi cảm thấy google đã sao chép cách thiết kế giao diện người dùng trong ứng dụng iOS , sẽ rất hợp lý nếu bạn quen với việc phát triển giao diện người dùng trong iOS, nhưng theo cách bố trí tương đối khó để đặt các ràng buộc mà không chạm vào thiết kế xml .

2) Thứ hai, nó có hệ thống phân cấp chế độ xem phẳng không giống như các bố cục khác, do đó hiệu suất tốt hơn so với bố cục tương đối mà bạn có thể thấy từ các câu trả lời khác

3) Nó cũng có những thứ bổ sung ngoài bố cục tương đối có, chẳng hạn như định vị tương đối tròn trong đó chúng ta có thể định vị một chế độ xem khác so với quan điểm này ở bán kính nhất định với góc nhất định không thể thực hiện trong bố cục tương đối

Tôi đang nói lại, thiết kế UI sử dụng bố cục ràng buộc cũng giống như thiết kế UI trong iOS, vì vậy trong tương lai nếu bạn làm việc trên iOS, bạn sẽ thấy dễ dàng hơn nếu bạn đã sử dụng bố cục ràng buộc


1

Sự khác biệt duy nhất tôi đã lưu ý là những thứ được đặt trong bố cục tương đối thông qua kéo và thả tự động có kích thước của chúng so với các yếu tố khác được suy ra, vì vậy khi bạn chạy ứng dụng, những gì bạn thấy là những gì bạn nhận được. Tuy nhiên, trong bố cục ràng buộc ngay cả khi bạn kéo và thả một phần tử trong chế độ xem thiết kế, khi bạn chạy ứng dụng, mọi thứ có thể bị thay đổi. Điều này có thể dễ dàng được khắc phục bằng cách cài đặt thủ công các ràng buộc hoặc, di chuyển rủi ro hơn là nhấp chuột phải vào phần tử trong cây thành phần, chọn menu phụ bố cục ràng buộc, sau đó nhấp vào 'suy ra các ràng buộc'. Hi vọng điêu nay co ich

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.