पॉपअपविंडो - बाहर क्लिक करने पर खारिज करें


93

मेरे पास मेरी गतिविधि पर एक पॉपअप विन्डोज़ है, बात मेरी पॉपअप विन्डोज़ की है, तब भी मैं दिखाता हूं जब मैं अपनी गतिविधि के साथ बातचीत कर रहा हूं (मेरी सूची पर स्क्रॉल करें)। मैं अपनी सूची के माध्यम से स्क्रॉल कर सकता हूं और पॉपअप विंडो अभी भी है।

स्क्रीन पर जब मैं पॉपअप विन्डोज़ नहीं कर रहा / टच / क्लिक / कर रहा / रही हूँ, तो मैं पॉपअप विन्डोज़ को खारिज करना चाहता हूँ। जैसे कोई मेनू कैसे काम करता है। यदि आपने मेनू के बाहर क्लिक किया है, तो मेनू को खारिज कर दिया जाएगा।

मैंने कोशिश की है, setOutsideTouchable(true)लेकिन यह खिड़की को खारिज नहीं करेगा। धन्यवाद।

जवाबों:


129

सेट करने का प्रयास करें setBackgroundDrawableपर PopupWindowयदि आप इसे से बाहर स्पर्श विंडो को बंद करना चाहिए।


5
मैंने इसे याद किया है। क्या आप अपने popupWindow पर setBackgroundDrawable का उपयोग कर रहे हैं? मुझे पता है कि बैकग्राउंड को अशक्त करने वाली पृष्ठभूमि को सेट करना OnTouchListener
Marcin S.

31
बस! thnx यार! इस मामले में, यहां तक ​​कि स्पर्श घटनाओं को भी ठीक से नियंत्रित किया जा सकता है। popupWindow.setOutsideTouchable (सही); popupWindow.setTouchable (सही); popupWindow.setBackgroundDrawable (नया BitmapDrawable ()); popupWindow.setTouchInterceptor (नया OnTouchListener () {@Override सार्वजनिक बूलियन onTouch (View v, MotionEvent event) {if (AppContext.isDebotMode ()) Log.d ("POPUP_WINDOW", "v:" + v.getTag) | ईवेंट: "+ event.getAction ()); पॉपअपविंडो। प्रिज्म (); रिटर्न ट्रू;}});
बीयरस्टॉर्म

3
अशक्त करने के लिए बैकग्राउंड ड्रॉइंग सेट करना मेरे लिए काम नहीं करता है। अगर किसी और के मुद्दे हैं, तो मेरा जवाब देखें।
mpellegr

2
@WareNinja, आपकी टिप्पणी काम कर गई! हो सकता है कि आप बेहतर इस quesiton के लिए एक पूरे answeir छोड़ देंगे, यह दूसरों के लिए उपयोगी होगा
एंटोन Kizema

3
@Areareinja BitmapDrawable()को वंचित किया जाता है। ColorDrawable()इसके बजाय उपयोग करें ।
सर्जन बरई

125

मैंने पाया कि मेरे द्वारा दिए गए जवाबों में से किसी ने भी काम नहीं किया, सिवाय वेयरनिजा की स्वीकृत जवाब पर टिप्पणी के, और मार्सिन एस की संभवतः काम करेगा। यहाँ वह हिस्सा है जो मेरे लिए काम करता है:

myPopupWindow.setBackgroundDrawable(new BitmapDrawable());
myPopupWindow.setOutsideTouchable(true);

वैकल्पिक रूप से:

myPopupWindow.setFocusable(true);

यह निश्चित नहीं है कि अंतर क्या हैं, लेकिन ListPopupWindow स्रोत कोड वास्तव में उत्तरार्द्ध का उपयोग करता है जब यह मॉडेम सेटमॉडल के साथ सही हो जाता है, इसलिए कम से कम एंड्रॉइड डेवलपर्स इसे व्यवहार्य दृष्टिकोण मानते हैं, और यह केवल एक पंक्ति है।


6
बहुत बहुत धन्यवाद। अन्य किसी भी उत्तर ने मेरे लिए काम नहीं किया या इसे पर्याप्त रूप से समझाया। दूसरा विकल्प हालांकि मेरे लिए काम नहीं कर रहा है।
JDN

2
इसके अलावा, मैं ध्यान देता हूं कि बिटमैपड्रेबल को अपदस्थ किया गया है। समस्या का वास्तविक समाधान करना अच्छा होगा, क्योंकि ये दिखने में अस्थायी वर्कअराउंड की तरह नए एपीआई संस्करणों में समर्थित होने की गारंटी नहीं है।
HAL9000

BitmapDrawable पदावनत निर्माणकर्ता का उपयोग नहीं करने के लिए, यहां देखें: stackoverflow.com/a/21680637/2048266 । popupWindow.setBackgroundDrawable (नया BitmapDrawable (getResources) (, ""));
nommer

की वैकल्पिक पद्धति का उपयोग करते समय setFocusable, हमें दो बार बटन पर क्लिक करने की आवश्यकता है (जहां बटन पॉप-अप के बाहर रखा गया है) जहां पहली विधि में यह ठीक काम करता है :)
जॉय रेक्स

BitmapDrawable()वंचित है। ColorDrawable()इसके बजाय उपयोग करें ।
सर्जन बरई

60

मैं एक ही मुद्दों से मिला, और इसे नीचे दिए गए कोड के रूप में तय किया। यह मेरे लिए ठीक काम करता है।

    // Closes the popup window when touch outside.
    mPopupWindow.setOutsideTouchable(true);
    mPopupWindow.setFocusable(true);
    // Removes default background.
    mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

BTW, BitmapDrawable पदावनत निर्माता का उपयोग न करें, डिफ़ॉल्ट पृष्ठभूमि को बदलने के लिए इस नए ColorDrawable (android.R.color.transparent) का उपयोग करें ।

मज़े करो@।@


3
अपना पॉपअप दिखाने से पहले इस कोड को ज़रूर डालें
sersesyan

क्या मुझे वास्तव में फोकस करने योग्य बनाने की आवश्यकता है यदि पॉपअप को फोकस की आवश्यकता नहीं है?
लेवोर

मुझे आश्चर्य है कि यह काम करता है, लेकिन यह एपीआई 21 पर आवश्यक है। यह भी तय है कि मेरी पॉपअप विंडो गलत तरीके से एनिमेशन कर रही थी।
एपिकपांडाफर्स

24

मुझे पता है कि देर हो चुकी है लेकिन मैं ध्यान देता हूं कि लोगों के पास अभी भी पॉपअप विंडो के साथ एक मुद्दा है। मैंने पूरी तरह से काम करने वाले उदाहरण को लिखने का फैसला किया है जहां आप पॉपअप विंडो को छूकर या उसके बाहर क्लिक करके या केवल विंडो को छूकर खारिज कर सकते हैं। ऐसा करने के लिए एक नया पॉपअप विन्डोज़ क्लास बनाएं और इस कोड को कॉपी करें:

PopupWindow.class

public class PopupWindow extends android.widget.PopupWindow
{
Context ctx;
Button btnDismiss;
TextView lblText;
View popupView;

public PopupWindow(Context context)
{
    super(context);

    ctx = context;
    popupView = LayoutInflater.from(context).inflate(R.layout.popup, null);
    setContentView(popupView);

    btnDismiss = (Button)popupView.findViewById(R.id.btn_dismiss);
    lblText = (TextView)popupView.findViewById(R.id.text);

    setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
    setWidth(WindowManager.LayoutParams.WRAP_CONTENT);

    // Closes the popup window when touch outside of it - when looses focus
    setOutsideTouchable(true);
    setFocusable(true);

    // Removes default black background
    setBackgroundDrawable(new BitmapDrawable());

    btnDismiss.setOnClickListener(new Button.OnClickListener(){

        @Override
        public void onClick(View v) {


         dismiss();
        }});

    // Closes the popup window when touch it
/*     this.setTouchInterceptor(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                dismiss();
            }
            return true;
        }
    }); */   
   } // End constructor

   // Attaches the view to its parent anchor-view at position x and y
   public void show(View anchor, int x, int y)
   {
      showAtLocation(anchor, Gravity.CENTER, x, y);
   }
}

अब पॉपअप विंडो के लिए लेआउट बनाएं: popup.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout     
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="1dp"
    android:orientation="vertical"
    android:padding="10dp" >

<TextView 
    android:id="@+id/text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"  
    android:gravity="center" 
    android:padding="5dp" 
    android:text="PopupWindow Example"
    android:textColor="#000000" 
    android:textSize="17sp" 
    android:textStyle="italic" />

<FrameLayout
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical">

    <Button
        android:id="@+id/btn_dismiss" 
        style="?android:attr/buttonStyleSmall" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Dismiss" 
        android:visibility="gone" />

    <TextView
        android:id="@+id/lbl_dismiss"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Touch outside of this box to dismiss"
        android:textColor="#ffffff"
        android:textStyle="bold" />

</FrameLayout>      

अपनी मुख्य गतिविधि में पॉपअप विंदो वर्ग का एक उदाहरण बनाएं:

final PopupWindow popupWindow = new PopupWindow(this);
popupWindow.show(findViewById(R.id.YOUR_MAIN_LAYOUT), 0, -250);

जहां Your_MAIN_LAYOUT वर्तमान गतिविधि का लेआउट है जिसमें पॉपअप विंदू पॉप अप होगा


1
धन्यवाद - यह मेरे लिए काम किया। बस एक छोटा सा नोट अपने कस्टम वर्ग के लिए पॉपअप विन्डोव के अलावा किसी अन्य नाम का उपयोग करना है, हो सकता है कि इसे पॉपअपविंडो के बजाय MyPopupWindow कहें, ताकि एंड्रॉइड आपके मानक एंड्रॉइड क्लास और आपके कस्टम वर्ग के बीच भ्रमित न हो।
शमौन

@Marcin S. findViewById (R.id.YOUR_MAIN_LAYOUT) ?? क्या यह R.layout.My_Layout होगा
कुमार जयसंसारिया

@Simon findViewById (R.id.YOUR_MAIN_LAYOUT) ?? क्या यह R.layout.My_Layout होगा?
अंकेश कुमार जयसंसारिया

15

@ LunaKong के उत्तर और @ ऑवरग्लास की पुष्टि के लिए धन्यवाद। मैं एक डुप्लिकेट टिप्पणी नहीं करना चाहता, लेकिन केवल इसे स्पष्ट और संक्षिप्त करना चाहता हूं।

// Closes the popup window when touch outside. This method was written informatively in Google's docs.
mPopupWindow.setOutsideTouchable(true);

// Set focus true to prevent a touch event to go to a below view (main layout), which works like a dialog with 'cancel' property => Try it! And you will know what I mean.
mPopupWindow.setFocusable(true);

// Removes default background.
mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

Mttdat।


मैं इसके बाहर क्लिक करके पॉपअप विंडो को बंद करने में सक्षम होना चाहता था, लेकिन जब मैंने किया, तो इसके नीचे के दृश्य (पॉपअप विंडो का हिस्सा नहीं, लेकिन गतिविधि का हिस्सा) पर क्लिक किया जा रहा था। setFocusabl (सच) वह था जिसकी मुझे तलाश थी। धन्यवाद!
hellaandrew

@ मोहल्ला, खुशी से यह आपकी मदद करता है, :)
गुयेन टैन डाट

8

एक के लिए ListPopupWindowसेट खिड़की एक मॉडल जब से पता चला हो।

mListPopupWindow.setModal(true);

इस तरह, ListPopupWindowवसीयत के बाहर क्लिक करने से यह खारिज हो जाएगा।


धन्यवाद, मैं सिर्फ इसके लिए देख रहा था। यह न केवल दृश्य के बाहर स्पर्श करने के बाद listpopupwindow बर्खास्तगी को सेट करता है, बल्कि टच इवेंट को अन्य दृश्य में भी पास नहीं करता है जो listpopwindow के पास हैं। मैं इस बात की सख्त तलाश कर रहा था क्योंकि मेरे मामले में लिस्ट पोपविंडो के बाहर छूने की घटना पुनर्नवीनीकरण को पारित कर रही थी जो कि सूचीबद्घप्रवृत्त को खारिज करने के बगल में था, और पुनर्नवीनीकरण आइटम का चयन किया जा रहा था जो मैं नहीं चाहता था।
शंकर_एलएल

आपको mListPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);ऑन-स्क्रीन कीबोर्ड के साथ पॉपअप विंडो को रोकने के लिए भी आवश्यकता हो सकती है ।
श्री-आईडीई

6

ध्यान दें कि रद्द करने के लिए popupWindow.setOutsideTouchable(true), आपको wrap_contentनीचे कोड की तरह चौड़ाई और ऊंचाई बनाने की आवश्यकता है :

PopupWindow popupWindow = new PopupWindow(
            G.layoutInflater.inflate(R.layout.lay_dialog_support, null, false),
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT, true);

popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(true);
popupWindow.showAtLocation(view, Gravity.RIGHT, 0, 0);

5
  popupWindow.setTouchable(true);
  popupWindow.setFocusable(true);
  popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);

जब स्क्रीन पर क्लिक / टच हो जाएगा तो यह पॉपअप विन्डो को खारिज कर देगा। सुनिश्चित करें कि आपने showAtLocation से पहले ध्यान देने योग्य सच सेट किया है।


1
कृपया विस्तृत विवरण के साथ कुछ व्याख्यात्मक पाठ जोड़ें कि यह पूछे गए प्रश्न का सटीक उत्तर कैसे प्रदान करता है। धन्यवाद।
परोपकारी उल्टा

धन्यवाद! आपको showAtLocation () को कॉल करने से पहले बसने वालों को कॉल करने की आवश्यकता है।
droid256

5

आप उपयोग कर सकते हैं isOutsideTouchable या isFocusable dissmiss पॉपअप विंडो को जब स्पर्श बाहर

popupWindow.isOutsideTouchable = true // dismiss popupwindow when touch outside

popupWindow.isFocusable = true // dismiss popupwindow when touch outside AND when press back button

ध्यान दें

  • वर्तमान में, परीक्षण के बाद मैं देखता setBackgroundDrawable हूं कि हमें पॉपअपविंडो को खारिज करने में मदद नहीं मिली है

  • यदि आप PopupWindow( PopupWindow->PopupDecorView->dispatchKeyEventऔर PopupWindow->PopupDecorView->onTouchEvent) में खारिज करने के लिए कोड को देखते हैं । आप देखेंगे कि जब बैक बटन दबाते हैं, तो वे खारिज कर देते हैं ACTION_UPऔर जब बाहर छूते हैं तो वे खारिज कर देते हैं ACTION_UPयाACTION_OUTSIDE



4

@LunaKong सुझाव कार्य एक आकर्षण की तरह है।

लेकिन mPopupWindow.setFocusable (झूठा) स्थापित करना पॉपअप विंडो को गायब करने के लिए आवश्यक अनावश्यक स्पर्श को हटाता है।

उदाहरण के लिए: मान लें कि स्क्रीन पर एक पॉप अप विंडो दिखाई दे रही है, और आप एक बटन पर क्लिक करने वाले हैं। तो इस मामले में, (अगर एक बटन popupwindow के पहले क्लिक पर mpopwindow.setFocusable (सच)) खारिज कर देगा। लेकिन बटन काम करने के लिए आपको फिर से क्लिक करना होगा। अगर ** (mpopwindwo.setFocusable (झूठा) ** बटन का एक क्लिक पॉपअप विंडो को खारिज कर देता है और साथ ही बटन पर क्लिक करता है। आशा है कि यह मदद करता है।


1
बहुत धन्यवाद! मैं ठीक उसी की तलाश में था
गणेश

3

खिड़की की पृष्ठभूमि पारदर्शी सेट करें:

PopupWindow.getBackground().setAlpha(0);

इसके बाद अपनी पृष्ठभूमि को लेआउट में सेट करें। ठीक काम करता है।


1
getBackground () शून्य हो सकता है।
जेरेड रुम्मलर

1

कुछ मामलों में पॉपअप को ध्यान देने योग्य बनाना वांछनीय नहीं है (उदाहरण के लिए, आप इसे दूसरे दृश्य से फोकस चुराना नहीं चाहेंगे)।

एक वैकल्पिक दृष्टिकोण एक स्पर्श इंटरसेप्टर का उपयोग कर रहा है:

popupWindow.setOutsideTouchable(true);
popupWindow.setTouchInterceptor(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
            popupWindow.dismiss();
        }
        return false;
    }
});

1

यदि यह पॉपअप विंडो एक अन्य गतिविधि है, और आपने इसका आकार मूल स्क्रीन पर घटा दिया है और आप बाहरी क्षेत्र को सक्षम या अक्षम करना चाहते हैं। तो आप इस कोड के द्वारा केवल बाहरी क्षेत्र को सक्षम या अक्षम कर सकते हैं:

सक्षम:

YourActivity.this.setFinishOnTouchOutside(true);

अक्षम:

YourActivity.this.setFinishOnTouchOutside(false);


0

PopupWindow को खारिज करने के लिए पॉपअप व्यू का उपयोग करें

`popupView.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View view) {
                       popupWindow.dismiss();
                   }
               }); 

`यदि आप इसका उपयोग करते हैं तो आप popupWindow के अंदर किसी भी बटन परOnClickListener सेट कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.