2011-10-23 16 views
8

में खंड लेआउट बदलें मैं अपने ऐप में सिंगल-एक्टिविटी मल्टी-फ्रैगमेंट डिज़ाइन को कार्यान्वित करना चाहता हूं। मैं कई "स्क्रीन" (टुकड़े के लेआउट) की योजना बनाने की योजना बना रहा हूं जिसे मैं कोड में (संभवतः बैक-स्टैक में जोड़ना) के बीच स्विच करूंगा।एंड्रॉइड - रनटाइम

मेरी समझ के लिए प्रत्येक स्क्रीन में टुकड़ों का लेआउट लेआउट ऑब्जेक्ट्स (जैसे फ़्रेमलेआउट) का उपयोग करके सेट किया गया है, जो टुकड़ों के लिए प्लेसहोल्डर्स (उसी आईडी को साझा करना) के रूप में कार्य करता है। चूंकि अलग-अलग स्क्रीनों में अलग-अलग टुकड़े की व्यवस्था होती है (एक फ्रेम फ्रेमआउट हो सकता है, और दूसरा लाइनरलाउट, आदि) मैं सोच रहा था: मैं रनटाइम में टुकड़ों के लेआउट के बीच कैसे स्विच करूं?

मैं फ्रैगमेंट्स को जोड़ना/बदलना (FragmentManager के माध्यम से) को समझता हूं, लेकिन मैं एक लाइव लेआउट के भीतर एक नया लेआउट जोड़ना चाहता हूं। "SetContentView" के लिए लेनदेन होने की तरह ...

मैं यह कैसे कर सकता हूं? धन्यवाद! डैनी।

+0

मैंने यहां एकल-गतिविधि बहु-टुकड़े कोड पोस्ट किए हैं: http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 779 9 3 9 1 # 779 9 3 9 – user999717

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। हालांकि, मुझे लगता है कि आपके उदाहरण शो ('R.id.mainframe') जैसे ही लेआउट में टुकड़ों के बीच स्विचिंग, मेरी समस्या का समाधान नहीं करती है, जो कि टुकड़ों के लेआउट के बीच स्विच करने का तरीका है। विशेष रूप से अगर लेआउट कोड में बनाए जाते हैं (ऑनंटेंट व्यू के बाद कहा जाता है), मेरे मामले की तरह। – DannyA

+0

ओह, मैं देखता हूं, इसलिए आप उन्हें फिर से चालू किए बिना मौजूदा टुकड़ों को फिर से पैरेंट करना चाहते हैं? यह तो दिलचस्प है. – user999717

उत्तर

4

यह निश्चित रूप से संभव है, केवल एक चीज जो आपको करने की ज़रूरत है वह है अपनी खुद की आईडी उत्पन्न करना। आईडी कुछ भी हो सकती हैं लेकिन उन्हें एप आईडी (आर में से) के साथ संघर्ष नहीं करना चाहिए और नकारात्मक नहीं होना चाहिए।

निम्न उदाहरण तय आईडी का एक सेट के साथ इस दर्शाता है:

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

आदेश एक अलग लेआउट पर जाने के लिए, आप टुकड़े को हटाने और उन्हें कहीं और जोड़ सकते हैं।
मुझे बताएं कि यह कैसा चल रहा है।

संपादित करें: स्पष्टीकरण, दृश्य और दृश्य समूह को एक बार तत्काल होने की आवश्यकता नहीं है और फिर गतिविधि के जीवनकाल के लिए रखा जाता है। बस सुनिश्चित करें कि उनके संबंधित दृश्य को हटाने से पहले किसी भी टुकड़े को हटा दिया गया है या अलग किया गया है। साथ ही, यदि आप ऑन्रेट के बाहर के विचारों को बनाते और निकालते हैं तो आपको यह सुनिश्चित करना चाहिए कि इसे SaveInstanceState पर उपयोग करके पुनर्स्थापित किया जा सके और प्रक्रिया को दोहराना शुरू कर दिया जाए। diagram here और configuration changes के अनुच्छेद पढ़ें।

+0

प्रयास के लिए धन्यवाद! चूंकि मैं एक एंड्रॉइड नौसिखिया हूं, मैं यह सुनिश्चित करना चाहता हूं कि मैंने आपको सही तरीके से समझा - क्या यह मेरी गतिविधि के मुख्य दृश्य से दृश्य और लेआउट को मेरे कोड में कहीं भी कहीं भी जोड़ना/निकालना ठीक है, न कि केवल क्रिएट (I मुझे नहीं लगता कि मैंने इसके लिए उदाहरण देखे हैं), और फिर फ्लाई पर उन्हें टुकड़े बनाएं और जोड़ें? यह सिर्फ "टुकड़ों को हटाने और उन्हें कहीं और जोड़ने" से थोड़ा अधिक है, क्योंकि मैं उनके लिए एक नया लेआउट बनाता हूं। – DannyA

+0

लक्ष्य अंततः इस Fragment तर्क को अलग-अलग "स्क्रीन" कक्षाओं में अलग करने के लिए है, और प्रत्येक वर्ग को अपने स्वयं के लेआउट आईडी के बारे में पता है, और अपने स्वयं के टुकड़े डालते हैं। फिर मैं खंड "लेनदेन" के माध्यम से एक "स्क्रीन" से दूसरे पर नेविगेट कर सकता हूं। जैसे पिछली स्क्रीन के सभी टुकड़े छुपाएं और इसके बजाय नए टुकड़े दिखाएं। मुझे स्वीकार करना होगा, यह तकनीक थोड़ा अजीब लगती है, क्योंकि यह अदृश्य टुकड़ों के साथ खाली लेआउट के साथ मेरी गतिविधि को बाढ़ देगा ... ऐसा लगता है कि मेरा लक्ष्य उचित है लेकिन मुझे इसके लिए सही डिज़ाइन नहीं मिला है। – DannyA

+0

वैसे यह विचार की एक दिलचस्प ट्रेन है, लेकिन क्या यह बिल्कुल सही नहीं है और उनकी शुरुआत सक्रियता (इरादा) विधि के लिए बनाई गई थी? आपको मुफ्त में बैक बटन कार्यक्षमता भी मिलती है। – user999717

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