كيف ولماذا تستخدم مستمعي رؤية Android

تم إنشاء Android UI من Views ، وفي التطبيقات العادية ، عادة ما يكون هناك العديد منها. لمعرفة طريقة العرض التي يبحث عنها المستخدم حاليًا ، تحتاج إلى تثبيت Visibility Listeners .

اقرأ أدناه للتعرف على الخيارات المختلفة التي لديك لتحديد حالة رؤية طريقة عرض.

كيف تصبح مرئيًا

لكي يعمل المستمعون لدينا ، يجب أن نتأكد أولاً من وجود طريقة العرض في التسلسل الهرمي للمخطط. هناك طريقتان يحدث هذا:

  1. العرض الخاص بك هو بالفعل جزء من التخطيط الخاص بك كما هو محدد في ملف XML
  2. لقد أنشأت طريقة عرض ديناميكيًا ، وتحتاج إلى إضافتها باستخدام طريقة addView
public void addView (View child, ViewGroup.LayoutParams params)

حالة رؤية طريقة العرض من النوع الصحيح ويمكن أن يكون لها أحد الخيارات الثلاثة:

  1. مرئي (0) - العرض مرئي للمستخدم
  2. غير مرئي (4) - يكون العرض غير مرئي للمستخدم ، ولكنه لا يزال يشغل مساحة في التخطيط
  3. ذهب (8) - المنظر غير مرئي ، ولا يشغل مساحة في التخطيط

بمجرد الدخول في التسلسل الهرمي للتخطيط لدينا ، هناك عدد قليل من الخيارات الأصلية لمساعدتنا على معرفة متى تغيرت رؤية طريقة العرض الخاصة بنا.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

يتم تشغيل هذه الطريقة عند تغيير رؤية العرض أو أحد أسلافه. تم العثور على حالة الرؤية داخل معلمة الرؤية.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

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

مستمعي الرؤية أثناء العمل

لرؤية هذين المستمعين أثناء العمل ، دعونا ننشئ مشروعًا بسيطًا. سيكون لدينا LinearLayout مع TextView وزر. سنجعل الزر عند النقر فوق إضافة عرضنا المخصص إلى التخطيط.

عرضنا المخصص:

package com.tomerpacific.viewvisibility; import android.content.Context; import android.graphics.Color; import android.util.Log; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import static android.view.Gravity.CENTER; public class MyCustomView extends LinearLayout { private final String TAG = MyCustomView.class.getSimpleName(); public MyCustomView(Context context) { super(context); this.setBackgroundColor(Color.GREEN); this.setGravity(CENTER); TextView myTextView = new TextView(context); myTextView.setText("My Custom View"); addView(myTextView); } @Override public void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); Log.d(TAG, "View " + changedView + " changed visibility to " + visibility); } @Override public void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); Log.d(TAG, "Window visibility changed to " + visibility); } }

وأخيرًا ، الكود الموجود في نشاطنا الرئيسي:

package com.tomerpacific.viewvisibility; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity { private Button addCustomViewBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addCustomViewBtn = (Button) findViewById(R.id.addCustomViewBtn); addCustomViewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout); MyCustomView myCustomView = new MyCustomView(getApplicationContext()); myCustomView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); mainLayout.addView(myCustomView); } }); } }

عند تشغيل التطبيق ونضغط على الزر نحصل على:

//giphy.com/gifs/8JZA6Djt7DmYpEXj2h/html5

يمكنك الحصول على نموذج المشروع هنا.

ViewTreeObserver

هذا كائن أصلي يحتوي على مجموعة واسعة من المستمعين الذين تم إخطارهم بتغييرات الرؤية المختلفة لشجرة العرض. بعض الشخصيات البارزة التي يجب الانتباه إليها هي:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

لإرفاق ViewTreeObserver ، عليك القيام بما يلي:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID); ViewTreeObserver viewTreeObserver = linearLayout.getViewTreeObserver(); viewTreeObserver.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); //TODO Add Logic } });

الخط linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)يتأكد من أنه سيتم استدعاء المستمع مرة واحدة فقط. إذا كنت تريد متابعة الاستماع إلى التغييرات ، فقم بإزالتها.

إذا كان لديك أي تعليقات أو اقتراحات ، فلا تتردد في إخباري.