linearlayout - الفرق بين الجاذبية و layout_gravity على Android
linearlayout equal spacing (12)
أعلم أنه يمكننا تعيين القيم التالية على android:gravity
و android:layout_gravity
:
-
center
-
center_vertical
-
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
.....
ملحوظة:-
يتم استخدام Gravity داخل " عرض المحتوى" حيث يكون لدى بعض المستخدمين إجابة وهي نفسها بالنسبة لكل
ViewGroup Layout
.يتم استخدام
Layout-gravity
مع الأصل عرض بعض المستخدمين لديهم إجابة.Gravity and Layout-gravity
هي أكثر فائدة مع الأطفالFrameLayout
.We can't use Gravity and Layout-gravity
في علامة FrameLayout.يمكننا تعيين عرض الطفل في أي مكان في
FrameLayout
باستخدامlayout-gravity
.يمكننا استخدام كل قيمة جاذبية واحدة داخل FrameLayout (على سبيل المثال: -
center_vertical
،center_horizontal
،center
،top
، إلخ) ، ولكن ذلك غير ممكن مع تخطيطات ViewGroup الأخرى.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>
ذات صلة
- الفرق بين الحشو في العرض والهامش
- Match_parent مقابل wrap_content
- كيفية تعيين كل من الجاذبية والتخطيط الجاذبية ل LinearLayout بشكل برمجي
android:gravity
-> لتعيين خطورة محتوى العرض المستخدم عليه.
android:layout_gravity
-> لتعيين جاذبية العرض أو android:layout_gravity
gravity : يستخدم لعرض بسيط مثل textview و edittext وغيرها.
يتم استخدام layout_gravity : لجاذبية العرض الحالية فقط في سياق العرض الأصلي النسبي مثل التنسيق الخطي أو FrameLayout لجعل العرض في المركز أو أي جاذبية أخرى للوالدين.
انظر إلى الصورة لتوضيح الجاذبية