2012-09-02 12 views
63

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

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

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

उत्तर

106

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

+0

लेकिन यह एक संवाद नहीं है, हालांकि यह पॉपअपविंडो – lorraine

+5

है, मैंने इसे याद किया है। क्या आप अपने पॉपअपविंडो पर सेटबैकग्राउंड ड्रायबल का उपयोग कर रहे हैं? मुझे पता है कि नट को खींचने योग्य पृष्ठभूमि को ऑनटचलिस्टर –

+0

को मारता है आपको यह मिल गया। पृष्ठभूमि को हटाने योग्य काम करता है। आप अपना उत्तर संपादित करना चाहेंगे, इसलिए मैं इसे स्वीकार किए जाने के रूप में चिह्नित कर सकता हूं। :) धन्यवाद मित्र। – lorraine

19

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

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>  
तो एक नया PopupWindow वर्ग इस कोड को बना सकते हैं और कॉपी कर सकता हूँ करने के लिए

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

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

जहां YOUR_MAIN_LAYOUT जिसमें popupWindow पॉप अप होगा

+1

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

+0

@ मार्सिन एस findViewById (R.id.YOUR_MAIN_LAYOUT) ?? क्या यह R.layout.My_Layout –

+0

@ सिमॉन findViewById (R.id.YOUR_MAIN_LAYOUT) होगा ?? क्या यह आर .layout.My_Layout होगा? –

91

मैंने पाया कि आपूर्ति की जवाब में से कोई भी स्वीकार किए जाते हैं जवाब पर मेरे लिए काम किया, WareNinja की टिप्पणी को छोड़कर वर्तमान गतिविधि के लेआउट है, और मार्किन एस की इच्छा भी काम करेगी।

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

वैकल्पिक:: यहाँ बात यह है कि मेरे लिए काम करता है

myPopupWindow.setFocusable(true); 
नहीं

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

PopupWindow.getBackground().setAlpha(0); 

यह लेआउट में अपनी पृष्ठभूमि सेट करने के बाद:

+5

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

+3

पहला समाधान काम करता है, लेकिन दूसरा वास्तव में नहीं करता है। – HAL9000

+2

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

3

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

+0

getBackground() शून्य हो सकता है। –

4

ListPopupWindow के लिए विंडो दिखाए जाने पर एक मॉडल होने के लिए सेट करें।

mListPopupWindow.setModal(true); 

इस तरह, ListPopupWindow के बाहर क्लिक इसे खारिज करेंगे।

42

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

// 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) का उपयोग डिफ़ॉल्ट पृष्ठभूमि को बदलने के लिए न करें।

एक आकर्षण की तरह मज़े @। @

+0

अपना पॉपअप दिखाने से पहले इस कोड को जोड़ना सुनिश्चित करें विन्डो –

2

@LunaKong सुझाव काम के।

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

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

+1

बहुत धन्यवाद! मैं बिल्कुल उसी – Ganesh

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

यह PopupWindow जब खारिज करेगा क्लिक करें सुनिश्चित करें कि आप showAtLocation से पहले फ़ोकस करने योग्य सच निर्धारित किया है screen.Make पर/स्पर्श

+1

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

5

सूचना है कि 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); 
0

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

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

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; 
    } 
}); 
+0

यह बात लॉलीपॉप संस्करण में काम नहीं कर रही है मैंने कोशिश की। –

3

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

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

// Set focus true to make prevent touch event to 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।

संबंधित मुद्दे