💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ ابوالفضل محمد قاسمی
در مورد ConstraintLayout
جامعه جاوا (اندروید) ایجاد شده در ۲۲ آذر ۱۳۹۸

وقت بخیر 

در ConstraintLayout وقتی دو ویو text view  یا هر المان دیگری رو در زیر هم قرار میدیم،موقع برقراری اتصال بین المان‌ها نیاز هست اتصال دو طرفه باشه؟ این رو برای این میگم که نمیدونم چرا وقتی من فقط اتصال یکطرفه ایجاد میکنم المان به شدت جابجا میشن و کل تنظیم صفحه به هم میریزه

سلام 

جواب کوتاه : نه نیاز نیست دو طرفه فه باشه

اگر جواب بالا کافی نیست می‌تونید پایین رو  نگاه بندازید (نظر شخصی خودم اینه جواب کوتاه به هیچ عنوان واسه منه مبتدی خوب نیست چون اصلا هیچی به معلومات منه مبتدی در حوزه اندروید اضافه نمی‌کنه و اینکه جواب دهنده جوابی داده که بگه جواب دادم همین !)

ولی  حتما  باید شرط‌ها ی خودتون رو انجام بدید 

به صورت افقی  حداقل با ید یک شرط و بخ صورت عمودی حداقل باید یک شرط

اگر این حداقل‌ها رو رعایت نکنیم  خوده Android studio بهمون میگه این طرحی که ما طراحی  کردیم در لحظه است  یعنی وقتی اجرا بشه یه چیزی  مثل الان که طراحی کردیم نمی‌بینیم

می خوام دو تا Text View رو زیر هم قرار بدم وقتی پروژه رو ساختیم با یک صفحه مثل زیر رو به رو میشیم و بعد از حذف (TextView(hello worldلایه ی ریشه مون  ConstaraintLayout می‌باشد

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

من یک TextViewاضلفه میکنم و به شکل زیر میشه 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        tools:layout_editor_absoluteX="139dp"
        tools:layout_editor_absoluteY="120dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

الان هیچ شرطی نگذاشتیم  اگر در tab Design(پایین سمت چپ) بریم و در قسمت   Component tree و موس رو روی TextViewبزاریم با تصویر زیر رو به رو هستیم 

link

 که بهمون میگه این viewشرطی روی آن اعمال نشده و این موقعیتی که میبینیم فقط در این لحظه است اگر همینجوری اجرا بشه  وقت اجرا میره به نقطه 0و0 که همون بالا سمت چپ میشه پس من دو شرطه horizentalرو اعمال برای اینکه TextView به صورت افقی وسط باشد 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        app:layout_constraintEnd_toEndOf="parent" //از آخر به به اخر والد وصل بشودبه تعبیری آخرشون یکی باشه 
        app:layout_constraintStart_toStartOf="parent" //از شروع به شروع والدوصل بشودبه تعبیری اولشون یکی باشه  
        tools:layout_editor_absoluteY="120dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

یعنی الان TextView مابه شکل افقی  وسط چین شده ولی هنوز خطایی که داشتیم برطرف نشده چون که ما هنوز به صورت عمودی شرطی رو قید نکردیم پس

app:layout_constraintTop_toTopOf="parent" // قسمت بالاشون یکی بشه به تعبیری بالاشون از یک نقطه شروع بشود

به TextView اضافه میکنیم  و می‌چسبد به بالا برای اینکه  فاصله بگیرد یه Margin میدیم که از بالا فاصله بگیرد به اندازه50dp  

و یک TextView دیگه اضافه میکنیم شرط های  افقی را اعمال میکنیم تا به صورت افقی مثل بالا وسط چین بشود و اینکه بالا TextViewجدیدمون رو به پایین TextViewrقلیمون اضافه میکنیم تا زیر هم باشند 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="TExt view"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="test" />
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" //اینجا میاد بالای المانی که داخلشیم رو به پایین شناسه ای که ذکر میکنیم متصل میکنه
        />
</androidx.constraintlayout.widget.ConstraintLayout>

اگر بخوایم اینم از  TextViewبالا مون یه ذره  فاصله بگیر فاصله بگیره بیه اینم میتونیم layout_marginTopبدیم  

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="TextView" />
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        tools:text="TextView" />
</androidx.constraintlayout.widget.ConstraintLayout>

اطلاعات اضافی در مورد ConstraintLayout

همان طور که مشخصه از کتابخانه androidx اضافه می‌شود 

یکی قدرتمند‌ترین لایه‌ها می‌باشد 

در سال 2016 در کنفرانسGoogle i/oمعرفی شد 

با api = 9 به بعد مشکلی ندارد 

میتونید اینجا بیشتر  بخونید

 

مهرداد ۲۲ آذر ۱۳۹۸، ۰۸:۲۴

وقتی دو تا view زیر هم قرار بگیرن  و قرار باشه با هم از وسط تراز باشن، باید از هر دو طرف align شده باشه، یعنی دو طرفه باشه

سعید شاهینی ۲۲ آذر ۱۳۹۸، ۰۹:۲۸

ممنون از توضیحات کاملتون مهرداد جان و همچنین از استاد عزیز، اما فکر کنم سوالم رو بد پرسیدم، منظور من این هست که به طور مثال:دو ویوو در صفحه داریم و میخوایم با شرط اتصال بین این ویوو‌ها رو با هم برقرار کنیم، من ویوو پایینی رو به ویوو بالایی متصل کردم، نیازی هست همین کار رو برای ویوو بالایی کنم یعنی ویوو بالایی رو هم به ویوو پایینی متصل کنم یا به عبارتی اتصال دو طرفه ایجاد کنم؟

دلیل این سوال برای این هست که من پروژه ای که استاد آموزش دادن رو ساختم وقتی اتصال بین ویووها یک طرفه بود ، بعضی از ویوو‌ها موقع در خروجی به هم ریخته نشون داده می‌شدند ولی وقتی اتصال رو دو طرفه کردم ، به سختی اما درست شد.

نکته: من صحبتی از شرط افقی نکردم و فقط فعلا دارم در مورد اتصال عمودی ویوو‌ها صحبت می‌کنم.

ابوالفضل محمد قاسمی ۲۲ آذر ۱۳۹۸، ۱۷:۵۶