2013-03-13 5 views
11

के लिए बाहरी स्पर्श की अनुमति दें मेरे पास मेरे ऐप में Fragment है जो DialogFragment दिखाता है।
मेरे पास टुकड़े में एक बटन है जो संवाद को बंद करता है। लेकिन जब मैं संवाद दिखाता हूं, तो संवाद से बाहर के स्पर्श कुछ भी नहीं करते हैं और मैं संवाद खंड से बाहर के बटन पर क्लिक नहीं कर सकता।डायलॉगफ्रैगमेंट

मैं डायलॉगफ्रैगमेंट के लिए बाहरी स्पर्शों को कैसे अनुमति दे सकता हूं?

उत्तर

15

ऐसा करने में, Window कि बाहर स्पर्श की अनुमति देता है की एक झंडे पर और अच्छी उपस्थिति के लिए दिया जाना चाहिए पृष्ठभूमि मंद झंडा साफ़ किया जाना चाहिए।
चूंकि इसे संवाद के बाद किया जाना चाहिए, इसलिए मैंने इसे Handler के माध्यम से कार्यान्वित किया है।

@Override 
public void onViewCreated(final View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // This is done in a post() since the dialog must be drawn before locating. 
    getView().post(new Runnable() { 

     @Override 
     public void run() { 

      Window dialogWindow = getDialog().getWindow(); 

      // Make the dialog possible to be outside touch 
      dialogWindow.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
      dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 

      getView().invalidate(); 
     } 
    }); 
} 

इस समय बाहरी स्पर्श संभव है।

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Hide title of the dialog 
    setStyle(STYLE_NO_FRAME, 0); 
} 
0

आपको अपनी आवश्यकताओं के लिए उचित शैली निर्धारित करने की आवश्यकता है। आप official docs में FragmentDialogs के लिए शैलियों के बारे में अधिक पढ़ सकते हैं।

मेरा मानना ​​है कि आप निम्नलिखित शैली इस्तेमाल कर सकते हैं:

  • STYLE_NO_FRAME
+0

मैं पहले से ही STYLE_NO_FRAME साथ काम कर रहा हूँ, और यह केवल एक है कि ठीक मेरे लिए (यूआई के बाद से)। – Yaniv

+1

@yaniv तो कोड दिखाने का समय है :) – Warpzit

3

यह किसी भी कार्रवाई केवल कार्यों

window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
     WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 
1
छू नहीं अनुमति देने के लिए अधिक सामान्य झंडा है:

मामले में हम इसे अच्छे और फ्रेम के बिना, निम्नलिखित कोड जोड़ा जा सकता है बनाना चाहते

मुझे बाहर स्पर्श पर खारिज करने के लिए वैकल्पिक तरीका मिला है। कोड नमूना नीचे की जांच करें, कि निश्चित रूप से काम करेगा,

@Override 
public void onStart() { 
    // mDialogView is member variable 
    mDialogView = getView(); 
    mDialogView.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      float eventX = event.getRawX(); 
      float eventY = event.getRawY(); 

      int location[] = new int[2]; 
      mDialogView.getLocationOnScreen(location); 

      if (eventX < location[0] || eventX > (location[0] + mDialogView.getWidth()) || eventY < location[1] 
        || eventY > location[1] + mDialogView.getHeight()) { 
       dismiss(); 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

मेरे मामले में, मुझे नहीं शून्य मान के रूप में getDialog() हो रही थी, लेकिन getDialog()। खारिज() काम नहीं कर रहा था। इसके अलावा, उपरोक्त के रूप में चिह्नित समाधान भी मेरे मामले में काम नहीं करता है। तो, मैंने यह दृष्टिकोण लिया।

0

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

FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    // For a little polish, specify a transition animation 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    // To make it fullscreen, use the 'content' root view as the container 
    // for the fragment, which is always the root view for the activity 
    transaction.add(android.R.id.content, newFragment) 
       .addToBackStack(null).commit(); 

और लेआउट wrap_content, जो जाहिरा तौर पर संवाद की तरह लग रहा होगा बनाने के लिए और डिफ़ॉल्ट रूप से यह स्क्रीन के शीर्ष पर रखा गया है।

अधिक जानकारी के लिए कृपया देखें here

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