2012-03-15 8 views
10

मैं बटनों की एक तालिका वाले दृश्य पदानुक्रम को सहेजने और पुनर्स्थापित करने का प्रयास कर रहा हूं। तालिका में आवश्यक तालिका पंक्तियों और बटनों की संख्या रनटाइम तक ज्ञात नहीं है, और मेरे Activity की onCreate(Bundle) विधि में एक inflated xml लेआउट में प्रोग्रामेटिक रूप से जोड़ा गया है। मेरा सवाल है: क्या अंतिम तालिका को एंड्रॉइड की डिफ़ॉल्ट दृश्य बचत/कार्यान्वयन बहाल करने के द्वारा सहेजा जा सकता है?सहेजे गए राज्य से दृश्य पदानुक्रम को पुनर्स्थापित करना प्रोग्रामेटिक रूप से जोड़े गए दृश्यों को पुनर्स्थापित नहीं करता है

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

setContentView(int) में संदर्भित XML फ़ाइल में अन्य चीजों के साथ, खाली TableLayout शामिल हैं जो बटन जोड़े गए हैं।

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Setup this activity's view. 
    setContentView(R.layout.game_board); 

    TableLayout table = (TableLayout) findViewById(R.id.table); 

    // If this is the first time building this view, programmatically 
    // add table rows and buttons. 
    if (savedInstanceState == null) { 
     int gridSize = 5; 
     // Create the table elements and add to the table. 
     int uniqueId = 1; 
     for (int i = 0; i < gridSize; i++) { 
      // Create table rows. 
      TableRow row = new TableRow(this); 
      row.setId(uniqueId++); 
      for (int j = 0; j < gridSize; j++) { 
       // Create buttons. 
       Button button = new Button(this); 
       button.setId(uniqueId++); 
       row.addView(button); 
      } 
      // Add row to the table. 
      table.addView(row); 
     } 
    } 
} 

मेरे समझ है कि Android, जब तक वे एक आईडी उन्हें सौंपे गए है के रूप में विचारों का राज्य बचाता है, और विचारों को पुनर्स्थापित करता है जब गतिविधि से निर्मित किया गया है, लेकिन अभी यह XML लेआउट और कुछ भी नहीं reinflate करने लगता है अधिक। कोड को डीबग करते समय, मैं पुष्टि कर सकता हूं कि onSaveInstanceState() तालिका में प्रत्येक Button पर कॉल किया गया है, लेकिन onRestoreInstanceState(Parcelable) नहीं है।

उत्तर

11

Activity, View और ViewGroup के लिए स्रोत कोड के माध्यम से खोज के बाद, मुझे पता चला कि प्रोग्राम के रूप में दृश्य जोड़े गए प्रोग्राम के रूप में जोड़ा गया है और एक ही आईडी प्रत्येक सौंपा जाना चाहिए समय onCreate(Bundle) कहा जाता है। यह इस बात पर ध्यान दिए बिना कि यह पहली बार दृश्य बना रहा है या गतिविधि को नष्ट करने के बाद दृश्य को पुनर्निर्माण कर रहा है। प्रोग्रामेटिक रूप से जोड़े गए दृश्यों की सहेजी गई घटना स्थिति को कॉल के दौरान Activity.onRestoreInstanceState(Bundle) पर पुनर्स्थापित किया जाता है। ऊपर दिए गए कोड का सबसे आसान जवाब savedInstanceState == null के लिए चेक को निकालने के लिए है।

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Setup this activity's view. 
    setContentView(R.layout.game_board); 

    TableLayout table = (TableLayout) findViewById(R.id.table); 

    int gridSize = 5; 
    // Create the table elements and add to the table. 
    int uniqueId = 1; 
    for (int i = 0; i < gridSize; i++) { 
     // Create table rows. 
     TableRow row = new TableRow(this); 
     row.setId(uniqueId++); 
     for (int j = 0; j < gridSize; j++) { 
      // Create buttons. 
      Button button = new Button(this); 
      button.setId(uniqueId++); 
      row.addView(button); 
     } 
     // Add row to the table. 
     table.addView(row); 
    } 
} 
+3

यह सही है: ढांचा प्रत्येक दृश्य की स्थिति को बचाता है और पुनर्स्थापित करता है, लेकिन यह कौन सा विचार मौजूद नहीं बचाता है। यही कारण है कि आपको 'saveContentView()' को कॉल करना होगा, भले ही 'savedInstanceState' शून्य न हो, और उसी तरह आपको अपने आप को' onrereate() '(या 'onCreateView()' के टुकड़ों के लिए कोई गतिशील दृश्य बनाना होगा)। ध्यान दें कि यदि आप बाद में विचार जोड़ते हैं (कहें, 'ऑनस्टार्ट()' में), तो उनकी सामग्री को पुनर्स्थापित करने में बहुत देर हो चुकी है। –

+0

तो मूल रूप से, यदि मेरी गतिविधि में उपयोगकर्ता इंटरैक्शन के माध्यम से उत्पन्न कई विचार और टुकड़े हैं, तो मुझे प्रत्येक आईडी, प्रत्येक दृश्य और प्रत्येक प्रकार के टुकड़े को याद रखना होगा? इस choce का कारण क्या है? ऐप की हत्या के दौरान वे सबकुछ क्यों बहाल नहीं करते थे? –

+0

क्या होगा यदि विचारों के दौरान विचारों को जोड़ा नहीं जा सकता है? –

0

यदि यह किसी आईडी के साथ दृश्यों के साथ काम करता है, तो प्रत्येक बटन को तालिका में एक आईडी क्यों न दें जब आप उन्हें बना रहे हों? देखें कि क्या यह काम करता है।

setContentView(R.layout.game_board); 

इसके अलावा, आप पंक्तियों और बटन के बराबर आईडी के आवंटित:

How can I assign an ID to a view programmatically?

+1

कृपया उपर्युक्त कोड की समीक्षा करें, सभी पंक्तियों और बटनों में पहले से ही उन्हें प्रोग्राम में जोड़ा गया है। – happydude

0

यह पंक्ति एक खाली लेआउट का पुनर्निर्माण करने वाला। आप दोनों पंक्तियों और बटन के लिए एक काउंटर का इस्तेमाल किया है चाहिए:

int idCounter = 1; 
    for (int i = 0; i < gridSize; i++) { 
     TableRow row = new TableRow(this); 
     row.setId(idCounter++); 
     for (int j = 0; j < gridSize; j++) { 
      Button button = new Button(this); 
      button.setId(idCounter++); 
      row.addView(button); 
     } 
     ... 
    } 
+0

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

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