Android UI व्यूज़ से बना होता है, और एक सामान्य ऐप्लिकेशन में आमतौर पर कई व्यूज़ होते हैं। यह जानने के लिए कि यूज़र वर्तमान में किस व्यू को देख रहा है, आपको विजिबिलिटी लिसनर्स इंस्टॉल करने होंगे।
व्यू के विजिबिलिटी स्टेटस की पहचान करने के लिए आपके पास मौजूद विभिन्न विकल्पों के बारे में जानने के लिए आगे पढ़ें।
विजिबल कैसे बनें
हमारे लिसनर्स के काम करने के लिए, हमें पहले यह सुनिश्चित करना होगा कि हमारा व्यू लेआउट हायरार्की में मौजूद है। ऐसा दो तरीकों से होता है:
- आपका व्यू पहले से ही आपके लेआउट का हिस्सा है क्योंकि यह XML फ़ाइल में परिभाषित है
- आपने डायनामिकली एक व्यू बनाया है, और आपको इसे addView मेथड का उपयोग करके जोड़ना होगा
public void addView (View child, ViewGroup.LayoutParams params)एक व्यू का विजिबिलिटी स्टेटस इंटीजर टाइप का होता है और इसके तीन विकल्प हो सकते हैं:
- VISIBLE (0) - व्यू यूज़र को दिखाई देता है
- INVISIBLE (4) - व्यू यूज़र के लिए अदृश्य है, लेकिन फिर भी लेआउट में जगह घेरता है
- GONE (8) - व्यू अदृश्य है, और यह लेआउट में कोई जगह नहीं घेरता
एक बार लेआउट हायरार्की में आने के बाद, हमारे व्यू की विजिबिलिटी कब बदलती है, यह जानने में मदद करने के लिए कुछ नेटिव विकल्प मौजूद हैं।
onVisibilityChanged
protected void onVisibilityChanged (View changedView, int visibility)यह मेथड तब ट्रिगर होता है जब व्यू की विजिबिलिटी या उसके किसी पूर्वज (ancestor) की विजिबिलिटी बदलती है। विजिबिलिटी का स्टेटस visibility पैरामीटर में होता है।
onWindowVisibilityChanged
protected void onWindowVisibilityChanged (int visibility)यह मेथड तब ट्रिगर होता है जब हमारे व्यू वाली विंडो की विजिबिलिटी बदलती है। इसका यह मतलब नहीं है कि आपका व्यू जिस विंडो में है वह यूज़र को दिखाई दे रहा है, क्योंकि वह किसी दूसरी विंडो से ढका हो सकता है।
विजिबिलिटी लिसनर्स एक्शन में
इन दो लिसनर्स को एक्शन में देखने के लिए, आइए एक सिंपल प्रोजेक्ट बनाते हैं। हमारे पास एक TextView और एक बटन के साथ एक LinearLayout होगा। हम बटन के ऑन-क्लिक एक्शन को अपने कस्टम व्यू को लेआउट में जोड़ने के लिए सेट करेंगे।

हमारा कस्टम व्यू:
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); } }और अंत में, हमारे MainActivity का कोड:
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); } }); } }जब हम ऐप्लिकेशन चलाते हैं और बटन दबाते हैं तो हमें मिलता है:
https://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 लॉजिक जोड़ें } });linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this) लाइन यह सुनिश्चित करती है कि लिसनर केवल एक बार कॉल होगा। यदि आप परिवर्तनों को सुनना जारी रखना चाहते हैं, तो इसे न हटाएं।
यदि आपके कोई कमेंट्स या सुझाव हैं, तो बेझिझक मुझे बताएं।