2011-11-08 16 views
16

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

मैंने यह पता लगाने में कामयाब रहा है कि खंड को कैसे बढ़ाया जाए और इसे बटन पर क्लिक करने पर पॉपअपविंडो में प्रदर्शित किया जाए। मेरे कोड इस तरह दिखता है:

public void onClick(View v) { 
    LayoutInflater inflater = (LayoutInflater) BrowsingActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View popupLayout = inflater.inflate(R.layout.serverconnection_fragment, null, false); 
    connectionListPopup = new PopupWindow(popupLayout, 300, 470, true); 
    connectionListPopup.showAtLocation(BrowsingActivity.this.findViewById(R.id.connectionListImage), Gravity.CENTER, 0, 0); 
} 

पॉपअप दिखाई देता है और यूआई serverconnection_fragment.xml में वर्णित हैं। समस्या यह है कि इसे इस तरह से बनाकर, फ्रैगमेंट क्लास ServerConnectionFragment.java कभी भी तत्काल नहीं किया जाता है, इसलिए मेरे यूआई में सूची में कोई आइटम नहीं है, बटन पर कोई श्रोताओं नहीं है, और इसी तरह। ऐसा लगता है कि जावा क्लास को तुरंत चालू करने का एक तरीका होना चाहिए, क्या यह सामान्य रूप से टुकड़े को बढ़ाता है और ईवेंट श्रोताओं को संलग्न करता है, फिर पॉपअपविंडो कन्स्ट्रक्टर में बनाए गए दृश्य को पास करता है, लेकिन मैं यह नहीं समझ सकता कि कैसे। क्या कोई मेरी मदद कर सकता है?

एफवाईआई, मैं फ्रैगमेंट कक्षाओं के लिए एंड्रॉइड-समर्थन-v4.jar फ़ाइल का उपयोग करके एंड्रॉइड 2.1 के लिए इसे बना रहा हूं।

उत्तर

17

सीधे लेआउट को घुमाने से यह खंड को तुरंत चालू नहीं करेगा; एंड्रॉइड सिर्फ यह एक संयोग मानता है कि दोनों टुकड़े और गतिविधि एक ही लेआउट फ़ाइल को संदर्भित करने का प्रयास कर रहे हैं।

आमतौर पर, आप लेआउट में एक टुकड़ा जोड़ने के लिए FragmentManager.add(int,Fragment) का उपयोग करेंगे। हालांकि, आपके द्वारा निर्दिष्ट कंटेनर आईडी को वर्तमान गतिविधि के लेआउट का हिस्सा होना चाहिए, और यह PopupWindow के मामले में नहीं है। इसके बजाय, आपको एक कंटेनर निर्दिष्ट किए बिना खंड प्रबंधक में टुकड़ा जोड़ना होगा, और फिर कुछ समय बाद खंड में (उदा। onStart()) आप पॉपअपविंडो दिखा सकते हैं। यह ठीक है कि कैसे DialogFragment काम करता है, और चूंकि इसके लिए पहले से ही बहुत सारे समर्थन हैं, इसलिए मैं सुझाव दूंगा कि आप इसके बजाय डायलॉगफ्रैगमेंट का उपयोग करने के लिए स्विच करें।

अपने टुकड़े कोड के साथ, बस Fragment के बजाय DialogFragment का विस्तार करें, और इसे प्रदर्शित करने के लिए DialogFragment.show(FragmentManager,String) का उपयोग करें। onCreate विधि में setStyle(DialogFragment.STYLE_NO_FRAME, getTheme()) पर कॉल करके आप डिफ़ॉल्ट सीमा से छुटकारा पा सकते हैं। आप अभी भी इस टुकड़े को एक लेआउट में जोड़ सकते हैं (जैसा कि आप कहते हैं, एक फोन पर जिसे आप पॉपअप के रूप में नहीं दिखाना चाहते हैं) और यह काम करेगा कि आप कैसे उम्मीद करते हैं।

+0

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

+1

क्या आप संभवतः अपने आखिरी वाक्य को समझा सकते हैं या उदाहरण दे सकते हैं, यदि संभव हो तो पॉपअपविंडो में खंड को प्रारंभिक उदाहरण के रूप में जोड़ना? "आप अभी भी इस टुकड़े को एक लेआउट में जोड़ सकते हैं (जैसा कि आप कहते हैं, उस फ़ोन पर जिसे आप नहीं चाहते हैं एक पॉपअप के रूप में दिखाया जाना है) और यह काम करेगा कि आप कैसे उम्मीद करते हैं। " – JPMagalhaes

+1

@JPMagalhaes, मजबूत सलाह देते हैं कि पॉपअपविंडो में खंड का उपयोग न करें क्योंकि यह मेमोरी रिसाव समस्या – Jacky

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