चूंकि टैबएक्टिविटी को बहिष्कृत किया गया है, इसलिए मुझे इसे टुकड़ों के साथ करने का एक तरीका ढूंढना होगा।
आप TabActivity
का उपयोग नहीं करना चाहते हैं - टैब की सामग्री में FragmentActivities
लगाने के बारे में भूल जाते हैं।
मुझे याद दिलाता है कि आप बिना के TabWidget
का उपयोग कर सकते हैं। तो आप इस समाधान को आजमा सकते हैं:
- केवल एक
FragmentActivity
बनाएं।
TabWidget
FragmentActivity
के लेआउट में रखें। TabWidget
की सामग्री की ऊंचाई = 0.
- बनाओ
TabWidget
तहत एक्सएमएल में के लिए आप Fragment
रों (उदाहरण के लिए FrameLayout
) कंटेनर की घोषणा।
FragmentActivity
में बस कौन सा टैब चुना गया है (TabHost.OnTabChangeListener
) को संभालें और आवश्यक Fragment
कंटेनर में रखें।
- विभिन्न खंडों में प्रोग्राम तर्क (जो पहले विभिन्न गतिविधियों में था) रखो।
या आप TabWidget
साथ FragmentActivity
बना सकते हैं, और बदले में स्विच करने से Fragment
रों आप कर सकते हैं के सीधे एक टैब की सामग्री में Fragment
रों डाल दिया।
उदाहरण के लिए यदि आपके पास 3 टैब और 3 खंड हैं जो मैं करता हूं। showFragmentX
पर कॉल करें जब आपको एक टुकड़ा दूसरे में बदलने की आवश्यकता है।
public class Test extends FragmentActivity {
private Fragment1 fragment1=new Fragment1();
private Fragment2 fragment2=new Fragment2();
private Fragment3 fragment3=new Fragment3();
private void showFragment1(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment1);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
private void showFragment2(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment2);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
private void showFragment3(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment3);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.fragmentactivity_layout);
}
}
आप तो अपने fragmentX
चर हर बार जब आप उन्हें fragment_container
में डाल नहीं हटेगा रहे हैं तो हो।वे रहते हैं जबकि आपके FragmentActivity
लाइव रहते हैं। fragments lifecycle पर नज़र डालें। केवल OnCreateView
और onDestroyView
टुकड़ों के तरीके बार-बार कॉल करेंगे जबकि आप replace
एक टुकड़ा दूसरे पर होंगे।
इसके अलावा टुकड़ों में उनकी onSaveInstanceState
विधि है जहां आप अपने टुकड़े की स्थिति को बचा सकते हैं। उदाहरण के लिए: उपयोगकर्ता ने अपना नाम खंड 1 के संपादन टेक्स्ट में टाइप किया। edittext भरने - आप इस डेटा (नाम स्ट्रिंग) रखने के लिए, जबकि उपयोगकर्ता अन्य टुकड़े आप
1.save fragment1 के onSaveInstanceState
विधि में नाम स्ट्रिंग चाहिए
2. fragment1 के onCreateView
विधि जांच savedInstanceState बंडल में, यह शून्य नहीं है, तो पता चलता है चाहते हैं स्ट्रिंग के साथ जो आप बंडल से प्राप्त करते हैं।
public class Fragment1 extends Fragment {
EditText nameEditText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View fragment1View=inflater.inflate(R.layout.fragment1_layout, container, false);
nameEditText=(EditText) fragment1View.findViewById(R.id.edittext_name);
//check for saved data. if it is not null - fill your edittext with saved string
if(savedInstanceState!=null){
String nameString=(String) savedInstanceState.get("nameString");
nameEditText.setText(nameString);
}
return fragment1View;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//save data that user have entered
outState.putString("nameString", nameEditText.getText().toString());
}
}
सहेजने से पहले आपको डेटा देख सकते हैं। मुझे उम्मीद है कि अब मेरा मुद्दा स्पष्ट है।
इसके अलावा अगर आप अपने fragment
की onCreateView()
विधि में setRetainInstance(true)
कहते हैं - प्रणाली (सभी इनपुट डेटा के साथ) टुकड़ा के राज्य को बचाने के लिए कोशिश करेंगे। link to description
Thx, लेकिन अगर मैं टैब में गतिविधियों के बजाय टुकड़े डालता हूं तो यह एक और मुद्दा आता है। उदाहरण के लिए, पहले टैब में, यदि उपयोगकर्ता एक बटन क्लिक करता है तो मैं कंटेनर को किसी अन्य खंड के साथ प्रतिस्थापित करना चाहता हूं, और फिर यदि मैं टैब को दूसरे स्थान पर बदलता हूं तो यह पिछले टुकड़ों को प्रतिस्थापित करेगा। तो यदि मैं पहले टैब पर फिर से जाता हूं तो यह फिर से टुकड़ा बना देगा और मैं पिछले पृष्ठ को देखने में सक्षम नहीं हूं। क्या आपको कोई विचार है कि इससे कैसे छुटकारा पाएं? – osayilgan
मैंने अपना जवाब संपादित कर लिया है। उस पर देखो। और नमूनों में भी खंड उदाहरण हैं ("एपिडेमोस")। उनकी जाँच करो। –
हाँ मुझे यह मिला, लेकिन यह वह चीज नहीं है जिसे मैं पूछ रहा हूं। मैंने टुकड़ों के साथ काम किया है और मुझे पता है कि यह कैसे काम करता है। जो चीज मुझे नहीं पता वह यह है कि: मान लीजिए कि हम पहले टैब में हैं और यदि उपयोगकर्ता बटन पर क्लिक करता है तो मैंने एक और टुकड़ा बुलाया, दूसरे चरण के लिए मैंने टैब को दूसरे स्थान पर बदल दिया, इसलिए यहां डेटा को प्रतिस्थापित किया जाएगा इसमें दूसरे टैब के टुकड़े के साथ सही है? लेकिन मैं यह भी रखना चाहता हूं कि पहले टैब में चीज बदल दी गई हो। तो इस तरह से अगर मैं सिर्फ तबाचेंज पर टुकड़ों को प्रतिस्थापित करता हूं तो यह पिछले टैब में पहले से बदली गई सामग्री को नहीं रखेगा। कोई उपाय ? – osayilgan