linearlayout - الفرق بين الجاذبية و layout_gravity على Android




linearlayout equal spacing (12)

أعلم أنه يمكننا تعيين القيم التالية على android:gravity و android:layout_gravity :

  1. center
  2. center_vertical
  3. center_horizontal ، إلخ.

ولكن أنا في حيرة بشأن كل من هذه.

ما هو الفرق بين استخدام android:gravity و android:layout_gravity ؟


الاختلاف

android:layout_gravity هي الجاذبية الخارجية android:layout_gravity . يحدد الاتجاه الذي يجب أن يلمس "العرض" حدوده الرئيسية.

android:gravity هي الجاذبية الداخلية لذلك العرض. يحدد في أي اتجاه يجب أن تكون محتوياته محاذاة.

HTML / CSS مكافئ

Android                 | CSS
————————————————————————+————————————
android:layout_gravity  | float
android:gravity         | text-align

خدعة سهلة لمساعدتك على التذكر

خذ layout-gravity كـ "Lay-external-gravity".


إذا أردنا تعيين خطورة المحتوى داخل العرض ، فسنستخدم "android: gravity" ، وإذا أردنا تعيين خطورة هذا العرض (ككل) ضمن العرض الأصلي ، فسنستخدم "android: layout_gravity ".


باختصار الجواب: استخدام android:gravity أو setGravity() للتحكم في خطورة كل مشاهدات الأطفال للحاوية ؛ استخدم android:layout_gravity أو setLayoutParams() للتحكم في خطورة العرض الفردي في الحاوية.

قصة طويلة: للتحكم في الجاذبية في حاوية تخطيط خطي مثل LinearLayout أو RadioGroup ، هناك طريقتان:

1) للتحكم في جاذبية جميع مشاهدات الأطفال LinearLayout (كما فعلت في كتابك) ، استخدم android:gravity (وليس android:layout_gravity ) في تنسيق ملف XML أو طريقة setGravity() في التعليمات البرمجية.

2) للتحكم في خطورة عرض الطفل في الحاوية الخاصة به ، استخدم سمة android:layout_gravity XML. في الرمز ، يحتاج المرء للحصول على LinearLayout.LayoutParams من وجهة نظر وتعيين جاذبيتها. في ما يلي مثال تعليمة برمجية تضبط زرًا لأسفل في حاوية موجهة أفقيًا:

import android.widget.LinearLayout.LayoutParams;
import android.view.Gravity;
...

Button button = (Button) findViewById(R.id.MyButtonId);
// need to cast to LinearLayout.LayoutParams to access the gravity field
LayoutParams params = (LayoutParams)button.getLayoutParams(); 
params.gravity = Gravity.BOTTOM;
button.setLayoutParams(params);

بالنسبة LinearLayout الأفقية LinearLayout ، تكون الجاذبية الأفقية LinearLayout عرضها الفرعية محاذية لليسار واحدة تلو الأخرى ولا يمكن تغييرها. إعداد android:layout_gravity إلى center_horizontal ليس له أي تأثير. الجاذبية العمودية الافتراضية هي المركز (أو الوسطي) ويمكن تغييرها إلى أعلى أو أسفل. في الواقع ، القيمة الافتراضية لـ layout_gravity هي -1 ولكن Android وضعها مركزًا عموديًا.

لتغيير المواضع الأفقية layout_weight الأطفال في حاوية خطية أفقية ، يمكن استخدام layout_weight ، هامش وحشو طريقة العرض التابعة.

وبالمثل ، بالنسبة لحاوية مجموعة العرض العمودية ، فإن الجاذبية الرأسية لطريقة عرض الطفل هي ذات اتجاه علوي واحد أسفل الآخر ولا يمكن تغييرها. الجاذبية الأفقية الافتراضية هي مركز (أو center_horizontal ) ويمكن تغييرها إلى اليسار أو اليمين.

في الواقع ، فإن مشاهدة الأطفال مثل زر له أيضًا سمة android:gravity XML وأسلوب setGravity() للتحكم في طرق العرض الفرعية - النص الموجود فيه. يتم Button.setGravity(int) بإدخال developer.android.com هذا.


خدعة سهلة لتذكر هذه هي الجاذبية تنطبق علينا داخل الأرض. لذا ، android:gravity داخل العرض.

تذكر الخروج في وضع _gravity والذي قد يساعدك على تذكر أن android:layout_gravity سيشير إلى خارج العرض


ظننت أنني سأضيف شرحًا خاصًا بي هنا - قادمًا من خلفية على نظام التشغيل iOS ، هذه هي الطريقة التي استوعبت بها الاثنين في مصطلحات iOS: يؤثر "مخطط الجاذبية" على موضعك في العرض الفائق. تؤثر "الجاذبية" على موقع عملياتك الفرعية داخلك. قال بطريقة أخرى ، Layout Gravity تضعك بنفسك بينما تضع الجاذبية أطفالك.


على الرغم من الإجابة على السؤال بالفعل لدي بعض العينات التي توضح استخدام الجاذبية ، و layout_gravity ، و layout_weight.

يمكنك العثور على الأمثلة في http://juanpickselov.com/LayoutExamples.zip

لقد قمت بإنشاء الملفات في Eclipse ، وأزلت المجلدات الفرعية .svn وقمت بتضمين أنماط ، سلاسل ، ألوان ، إلخ. ملفات التخطيط هي النقطة الرئيسية للعروض التوضيحية. نظرًا لأنني مبتدئ في تطوير جافا وأندرويد ، فقد نجد جافا غير فعال. يمكن نسخ الملفات إلى مشروع Eclipse أو استخدمتها أيضًا في Netbeans مع المكوّن الإضافي لتطوير Android المتاح لذلك IDE.


هناك اختلاف كبير في gravity layout-gravity . سأشرح تجربتي حول هذين المفهومين ( كل المعلومات التي حصلت عليها بسبب ملاحظتي وبعض المواقع ).

استخدام الجاذبية والتخطيط الجاذبية في FrameLayout .....

ملحوظة:-

  1. يتم استخدام Gravity داخل " عرض المحتوى" حيث يكون لدى بعض المستخدمين إجابة وهي نفسها بالنسبة لكل ViewGroup Layout .

  2. يتم استخدام Layout-gravity مع الأصل عرض بعض المستخدمين لديهم إجابة.

  3. Gravity and Layout-gravity هي أكثر فائدة مع الأطفال FrameLayout . We can't use Gravity and Layout-gravity في علامة FrameLayout.

  4. يمكننا تعيين عرض الطفل في أي مكان في FrameLayout باستخدام layout-gravity .

  5. يمكننا استخدام كل قيمة جاذبية واحدة داخل FrameLayout (على سبيل المثال: - center_vertical ، center_horizontal ، center ، top ، إلخ) ، ولكن ذلك غير ممكن مع تخطيطات ViewGroup الأخرى.

  6. FrameLayout تعمل بشكل كامل على Layout-gravity . مثال: - إذا كنت تعمل على FrameLayout فلن تحتاج إلى تغيير التخطيط بأكمله لإضافة طريقة عرض جديدة. ما عليك سوى إضافة عرض كآخر في FrameLayout وتعطيه Layout-gravity مع القيمة. ( هذه هي adavantages of layout-gravity مع FrameLayout ).

نلقي نظرة على سبيل المثال ......

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="center"
        android:text="Center Layout Gravity"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#1b64b9"
        android:gravity="bottom"
        android:layout_gravity="bottom|center"
        android:text="Bottom Layout Gravity" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#d75d1c"
        android:gravity="top"
        android:layout_gravity="top|center"
        android:text="Top Layout Gravity"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="100dp"
        android:textColor="#d71f1c"
        android:gravity="top|right"
        android:layout_gravity="top|right"
        android:text="Top Right Layout Gravity"/>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="bottom"
        android:gravity="bottom"
        android:text="Top Left Layout Gravity"/>

</FrameLayout>

انتاج:-

استخدام الجاذبية والتخطيط الجاذبية في LinearLayout .....

تعمل Gravity النحو الوارد أعلاه ، ولكن هنا يختلف اختلافنا عن أننا نستطيع استخدام Gravity داخل LinearLayout View وعرض RelativeLayout View وهو أمر غير ممكن في FrameLayout View .

LinearLayout مع التوجه الرأسي ....

ملاحظة: - هنا يمكننا تعيين 3 قيم من layout_gravity وهي ( left | right | center (تسمى أيضًا center_horizontal )).

ننظر على سبيل المثال: -

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="center_horizontal"
        android:text="Center Layout Gravity \nor \nCenter_Horizontal"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="20dp"
        android:textColor="#d75d1c"
        android:layout_gravity="right"
        android:text="Right Layout Gravity"/>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="left"
        android:layout_marginTop="20dp"
        android:gravity="bottom"
        android:text="Left Layout Gravity"/>

</LinearLayout>

انتاج:-

LinearLayout مع التوجه الأفقي ....

ملاحظة: - هنا يمكننا تعيين 3 قيم من layout_gravity وهي ( top | bottom | center (تسمى أيضًا center_vertical )).

ننظر على سبيل المثال: -

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

    <TextView
        android:layout_width="120dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="bottom"
        android:text="Bottom \nLayout \nGravity"/>

    <TextView
        android:layout_width="120dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="20dp"
        android:textColor="#d75d1c"
        android:layout_gravity="center"
        android:text="Center \nLayout \nGravity"/>


    <TextView
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="left"
        android:layout_marginTop="20dp"
        android:text="Left \nLayout \nGravity"/>

</LinearLayout>

انتاج:-

ملاحظة: - لا يمكننا استخدام layout_gravity في RelativeLayout Views ولكن يمكننا استخدام gravity لتعيين الأطفال RelativeLayout إلى نفس الموضع ....


يتم استخدام Gravity لضبط محاذاة النص في طرق العرض ولكن يتم استخدام layout_gravity لضبط المشاهدات بنفسها. دعونا نأخذ مثالا إذا كنت ترغب في محاذاة النص المكتوب في editText ثم استخدم الجاذبية وتريد محاذاة هذا editText أو أي زر أو أي رأي ثم استخدام layout_gravity ، لذلك في غاية البساطة.


داخل خارج

  • gravity يرتب المحتوى داخل العرض.
  • lay out _gravity يرتب موقف الرأي خارج نفسه.

في بعض الأحيان يساعد على رؤية صورة أيضا. الأخضر والأزرق TextViews الآخرين هما LinearLayouts .

ملاحظات

  • لا يعمل layout_gravity مع طرق العرض في RelativeLayout . استخدامه لوجهات النظر في LinearLayout أو FrameLayout . انظر إجابتي التكميلية لمزيد من التفاصيل.
  • يجب أن يكون عرض العرض (أو الارتفاع) أكبر من محتواه. وإلا فإن gravity لن يكون لها أي تأثير. وبالتالي ، فإن wrap_content gravity لا معنى لها معًا.
  • يجب أن يكون عرض العرض (أو الطول) أقل من الأصل. وإلا لن يكون layout_gravity أي تأثير. وبالتالي ، فإن match_parent و layout_gravity لا معنى لها معًا.
  • layout_gravity=center مثل layout_gravity=center_horizontal هنا لأنهم في مخطط خطي عمودي. لا يمكنك توسيط عموديًا في هذه الحالة ، لذلك layout_gravity=center مركزًا أفقيًا فقط.
  • تناولت هذه الإجابة فقط وضع gravity و layout_gravity على المشاهدات داخل التخطيط. لمعرفة ما يحدث عند تعيين gravity التخطيط الرئيسي نفسه ، تحقق من الإجابة التكميلية التي أشرت إليها أعلاه. (ملخص: gravity لا تعمل بشكل جيد على RelativeLayout ولكن يمكن أن تكون مفيدة مع LinearLayout .)

تذكر أن تنسيق _gravity يرتب طريقة عرض في تخطيطه . تقوم Gravity بترتيب المحتوى داخل العرض.

أكس

هنا هو xml للصورة أعلاه للرجوع اليها:

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#e3e2ad"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textSize="24sp"
            android:text="gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="left"
            android:text="left" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center_horizontal"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="right"
            android:text="right" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center"
            android:text="center" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#d6c6cd"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textSize="24sp"
            android:text="layout_gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="left"
            android:background="#bcf5b1"
            android:text="left" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:background="#aacaff"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="right"
            android:background="#bcf5b1"
            android:text="right" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:background="#aacaff"
            android:text="center" />

    </LinearLayout>

</LinearLayout>

ذات صلة


android:gravity -> لتعيين خطورة محتوى العرض المستخدم عليه.

android:layout_gravity -> لتعيين جاذبية العرض أو android:layout_gravity


gravity : يستخدم لعرض بسيط مثل textview و edittext وغيرها.

يتم استخدام layout_gravity : لجاذبية العرض الحالية فقط في سياق العرض الأصلي النسبي مثل التنسيق الخطي أو FrameLayout لجعل العرض في المركز أو أي جاذبية أخرى للوالدين.


انظر إلى الصورة لتوضيح الجاذبية





android-gravity