एंड्रॉइड यूआई दृश्यों से बनाया गया है, और एक नियमित एप्लिकेशन में, आमतौर पर उनमें से कई होते हैं। यह पता लगाने के लिए कि उपयोगकर्ता वर्तमान में किस दृश्य को देख रहा है, आपको दृश्यता श्रोता . स्थापित करने की आवश्यकता है ।
किसी दृश्य की दृश्यता स्थिति की पहचान करने के लिए आपके पास विभिन्न विकल्पों के बारे में जानने के लिए नीचे पढ़ें।
दृश्यमान कैसे बनें
हमारे श्रोताओं के काम करने के लिए, हमें पहले यह सुनिश्चित करना होगा कि हमारा व्यू लेआउट पदानुक्रम में पाया जाता है। ऐसा होने के दो तरीके हैं:
- आपका दृश्य पहले से ही आपके लेआउट का हिस्सा है क्योंकि इसे XML फ़ाइल में परिभाषित किया गया है
- आपने गतिशील रूप से एक दृश्य बनाया है, और आपको इसे addView विधि का उपयोग करके जोड़ना होगा
public void addView (View child, ViewGroup.LayoutParams params)
एक दृश्य की दृश्यता स्थिति पूर्णांक प्रकार की होती है और इसमें तीन विकल्पों में से एक हो सकता है:
- दृश्यमान (0) - दृश्य उपयोगकर्ता को दिखाई देता है
- अदृश्य (4) - दृश्य उपयोगकर्ता के लिए अदृश्य है, लेकिन फिर भी लेआउट में जगह लेता है
- चला गया (8) - दृश्य अदृश्य है, और यह लेआउट में जगह नहीं लेता है
एक बार हमारे लेआउट पदानुक्रम के अंदर, हमारे दृश्य की दृश्यता कब बदल गई है, यह जानने में हमारी सहायता के लिए कुछ मूल विकल्प हैं।
onVisibilityChanged
protected void onVisibilityChanged (View changedView, int visibility)
यह विधि तब शुरू होती है जब दृश्य की दृश्यता या दृश्य के पूर्वज की दृश्यता बदल जाती है। दृश्यता की स्थिति दृश्यता पैरामीटर के अंदर पाई जाती है।
onWindowVisibilityChanged
protected void onWindowVisibilityChanged (int visibility)
यह विधि तब शुरू होती है जब हमारे व्यू की युक्त विंडो ने अपनी दृश्यता बदल दी है। यह इस बात की गारंटी नहीं देता है कि आपका दृश्य जिस विंडो में है वह उपयोगकर्ता के लिए दृश्यमान है, क्योंकि यह किसी अन्य विंडो द्वारा अस्पष्ट हो सकती है।
दृश्यता श्रोता कार्रवाई में हैं
इन दो श्रोताओं को कार्य करते हुए देखने के लिए, आइए हम एक सरल परियोजना बनाते हैं। हमारे पास टेक्स्ट व्यू और एक बटन के साथ एक लीनियरलाउट होगा। हम बटन की क्लिक क्रिया को लेआउट में अपना कस्टम दृश्य जोड़ देंगे।
हमारा कस्टम दृश्य:
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
- ऑनविंडोअटैच लिस्टनर
- 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)
सुनिश्चित करता है कि श्रोता को केवल एक बार बुलाया जाएगा। यदि आप परिवर्तनों को सुनना जारी रखना चाहते हैं, तो इसे हटा दें।
अगर आपके पास कोई टिप्पणी या सुझाव है, तो बेझिझक मुझे बताएं।