18

मेरे पास टुकड़ों का उपयोग करके एक ऐप है, जिनमें से सभी एक ही गतिविधि में निहित हैं। गतिविधि बटन के मेनू वाले एक टुकड़े से शुरू होती है, जिनमें से सभी मूल बटन/मेनू खंड को बदलने के लिए विभिन्न सूचीफ्रेम का कारण बनती हैं।अभिविन्यास परिवर्तन पर सूची खंड में सूची बनाए रखना

मेरी समस्या यह है कि एक अभिविन्यास परिवर्तन पर, यदि गतिविधि सूचीदृश्यों में से किसी एक को प्रदर्शित कर रही है, तो यह दूर हो जाती है और बटन मेनू लौटाता है। मैं समझता हूं कि यह क्यों हो रहा है ... गतिविधि नष्ट हो गई है और फिर से बनाई गई है, लेकिन इसके आसपास काम नहीं करना है और अभिविन्यास परिवर्तन के माध्यम से सूची दृश्य/वर्तमान खंड को बनाए रखना है।

मुझे setRetainInstance और here का उपयोग करने का उदाहरण मिला है, लेकिन मैं यह नहीं समझ सकता कि बटन मेनू के साथ मेरी स्थिति में इसे कैसे लागू किया जाए या संभावना है कि मैं जिस टुकड़े को बरकरार रखना चाहता हूं वह कई अलग-अलग हो सकता है लोगों को।

नीचे मुख्य गतिविधि और सूचीकरण में से एक दिखाने के लिए कोड को सरल बनाया गया है।

कोई भी पॉइंटर्स जो इसे जोड़ने के लिए जोड़ता है ताकि सूची खंड बनाए रखा जाएगा, इसकी सराहना की जाएगी।

गतिविधि

public class Main extends FragmentActivity { 
    private MainMenuFragment menu; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     menu = new MainMenuFragment(); 
     getSupportFragmentManager().beginTransaction().replace(R.id.pane, menu).commit();  
    } 
} 

ListFragment

public class ItemListFragment extends ListFragment { 

    private TextView header; 
    private TextView empty; 
    private Button add; 
    public static Cursor itemCursor; 
    private GroceryDB mDbHelper; 
    public static long mRowId; 
    public static CheckCursorAdapter lists; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.common_list, container, false); 
     header = (TextView) v.findViewById(R.id.header); 
     empty = (TextView) v.findViewById(android.R.id.empty); 
     header.setText(R.string.header_item); 
     empty.setText(R.string.empty_items); 
     return v; 
    } 

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

     mRowId=0; 
     mDbHelper = new GroceryDB(getActivity()); 
     mDbHelper.open(); 

     itemCursor = mDbHelper.fetchAllItems(); 
     getActivity().startManagingCursor(itemCursor); 

     String[] from = new String[] { GroceryDB.ITEM_NAME }; 
     int[] to = new int[] { R.id.ListItem }; 
     lists = new CheckCursorAdapter(getActivity(), 
       R.layout.listlayout_itemlist, itemCursor, from, to); 
     setListAdapter(lists);   
    } 
} 

उत्तर

34

कि यह कैसे हल करने के लिए और उन्मुखीकरण परिवर्तन के माध्यम से सूची दृश्य/वर्तमान टुकड़ा बनाए रखने के लिए

आप हर बार onCreate() कहलाते हैं तो आप अंधेरे को टुकड़े को बदल रहे हैं। इसके बजाय, अगर savedInstanceState()null है तो खंड को केवल जोड़ें/बदलें। यदि यह null नहीं है, तो आप कॉन्फ़िगरेशन परिवर्तन से वापस आ रहे हैं, और आपके मौजूदा टुकड़े फिर से बनाए जाएंगे (या, यदि वे बनाए रखा गया था, तो वे पहले से ही वहां हैं)।

setRetainInstance(true) का मतलब है कि स्वयं गतिविधि की तरह नष्ट/पुनर्निर्मित होने की बजाय विन्यास परिवर्तनों में बनाए रखा जाएगा। हालांकि, इसे अभी भी onCreateView() के साथ बुलाया जाएगा। आपके कोड में, इसका मतलब है कि ItemListFragment के आपके डेटा सदस्य आसपास रहेंगे, लेकिन आपको अभी भी setListAdapter() पर कॉल करने की आवश्यकता होगी, भले ही आपको डेटाबेस की आवश्यकता न हो।

+0

अच्छा, वह अविश्वसनीय रूप से शर्मनाक था (मेरे गूंगा का उल्लेख नहीं)। मैं ** ** जानता हूं कि मुझे सहेजे गए इन्स्टेंसस्टेट() के लिए जांच करनी चाहिए, लेकिन किसी कारण से मैंने इस बार ऐसा नहीं किया और कभी भी इसके बारे में सोचा नहीं। जल्दी जवाब देने का शुक्रिया। – Barak

0

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

इस तरह से यह गतिविधि (और सूचीबद्धता) को पुनर्जीवित करते समय डेटा रखता है और आप यह जांचने के लिए जांच सकते हैं कि क्या आपके पास आपके सिक्योरेट में कोई डेटा है या नहीं। यदि list == null या list.size < 0 आप सामान्य रूप से आगे बढ़ते हैं और डेटा को प्राप्त करते हैं तो आप इसे सामान्य रूप से प्राप्त करते हैं। अन्यथा आप अपने सूची एडाप्टर को पहले से मौजूद डेटा के साथ सेट करें।

मेरे लिए यह बहुत आसान है, और एंड्रॉइड मास्टर/विस्तार प्रवाह प्रोजेक्ट बनाने के दौरान एक्लिप्स स्वचालित रूप से आपके डेटा के लिए एक समान डमीकंटेंट क्लास बनाता है क्योंकि इसे मूल रूप से केवल आपकी सूचीफ्रेम के बढ़ने की आवश्यकता होती है।

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