5

चूंकि टैबएक्टिविटी को बहिष्कृत किया गया है, इसलिए मुझे इसे टुकड़ों के साथ करने का एक तरीका ढूंढना होगा। मैंने फ्रैगमेंट्स के साथ काम किया है इससे पहले कि मुझे पता चले कि यह कैसे काम करता है लेकिन मुझे फ्रैगमेंट एक्टिविटीज के साथ अपना टैब होस्ट बनाने के लिए एक गाइड चाहिए। मुझे इंटरनेट पर कुछ उदाहरण मिल गए हैं, और वे टैब के लिए एक कंटेनर में टुकड़े डालने के बारे में हैं।फ्रैगमेंट एक्टिविटी और फ्रैगमेंट्स के साथ टैबएक्टिविटी का प्रतिस्थापन

मैं चाहता हूं कि प्रत्येक टैब के लिए FragmentActivities डालें। क्योंकि मेरे आवेदन में मैं 4 टैब का उपयोग करूँगा और प्रत्येक टैब में वास्तव में जटिल सामग्री होगी। नतीजतन, मुझे प्रत्येक टैब के लिए फ्रैगमेंट एक्टिविटी की आवश्यकता होती है ताकि मैं प्रत्येक टैब के नीचे एक अलग कंटेनर के भीतर रख सकूं।

समाधान:

जवाब के बाद और इंटरनेट मैं एक समाधान के साथ समाप्त हो गया पर खोज कर। मैंने पाया समाधान के मुताबिक, मैं टैब होस्ट के तहत प्रत्येक टैब के लिए अलग-अलग स्टैक में टुकड़ों का ट्रैक रखता हूं। Here मेरा गिटहब भंडार है, मैंने इस समस्या के लिए एक छोटा सा नमूना ऐप बनाया है।

उत्तर

9

चूंकि टैबएक्टिविटी को बहिष्कृत किया गया है, इसलिए मुझे इसे टुकड़ों के साथ करने का एक तरीका ढूंढना होगा।

आप TabActivity का उपयोग नहीं करना चाहते हैं - टैब की सामग्री में FragmentActivities लगाने के बारे में भूल जाते हैं।

मुझे याद दिलाता है कि आप बिना के TabWidget का उपयोग कर सकते हैं। तो आप इस समाधान को आजमा सकते हैं:

  1. केवल एक FragmentActivity बनाएं।
  2. TabWidgetFragmentActivity के लेआउट में रखें। TabWidget की सामग्री की ऊंचाई = 0.
  3. बनाओ TabWidget तहत एक्सएमएल में के लिए आप Fragment रों (उदाहरण के लिए FrameLayout) कंटेनर की घोषणा।
  4. FragmentActivity में बस कौन सा टैब चुना गया है (TabHost.OnTabChangeListener) को संभालें और आवश्यक Fragment कंटेनर में रखें।
  5. विभिन्न खंडों में प्रोग्राम तर्क (जो पहले विभिन्न गतिविधियों में था) रखो।

या आप 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

+0

Thx, लेकिन अगर मैं टैब में गतिविधियों के बजाय टुकड़े डालता हूं तो यह एक और मुद्दा आता है। उदाहरण के लिए, पहले टैब में, यदि उपयोगकर्ता एक बटन क्लिक करता है तो मैं कंटेनर को किसी अन्य खंड के साथ प्रतिस्थापित करना चाहता हूं, और फिर यदि मैं टैब को दूसरे स्थान पर बदलता हूं तो यह पिछले टुकड़ों को प्रतिस्थापित करेगा। तो यदि मैं पहले टैब पर फिर से जाता हूं तो यह फिर से टुकड़ा बना देगा और मैं पिछले पृष्ठ को देखने में सक्षम नहीं हूं। क्या आपको कोई विचार है कि इससे कैसे छुटकारा पाएं? – osayilgan

+0

मैंने अपना जवाब संपादित कर लिया है। उस पर देखो। और नमूनों में भी खंड उदाहरण हैं ("एपिडेमोस")। उनकी जाँच करो। –

+0

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

1

अलग-अलग गतिविधियों में टैब सामग्री डालने का दृष्टिकोण बहिष्कृत किया गया है, क्योंकि अब हमारे पास फ्रैगमेंट फ्रेमवर्क है। आपको टैब की जटिल सामग्री को टुकड़ों में रखना चाहिए, और जब उपयोगकर्ता टैब का चयन करते हैं तो उन टुकड़ों को स्वैप करें।

इसके लिए अनुशंसित समाधान टैबहोस्ट विजेट का उपयोग करने के बजाय टैब नेविगेशन के साथ एक्शनबार का उपयोग करना है।

+0

उत्तर के लिए धन्यवाद, मुझे इसका उपयोग करने के बारे में कुछ चिंताएं हैं। उदाहरण के लिए, यदि मैंने पहले टैब के लिए एक टुकड़ा रखा है, तो मुझे उसी टैब के भीतर एक नेविगेशन की आवश्यकता होगी और जहां तक ​​मुझे पता है कि हम पूरे टैब और इसके टुकड़ों के लिए केवल एक कंटेनर का उपयोग कर रहे हैं, इसलिए कुछ टुकड़े जोड़ने के बाद पहले टैब के भीतर मुख्य कंटेनर, मैं इसे दूसरे टैब में बदल दूंगा, इसलिए जब मैं ऐसा करता हूं, तो यह मेरे द्वारा बनाए गए सभी टुकड़ों को हटा देगा और पहले टैब के भीतर कंटेनर में रखेगा और यह दूसरा टुकड़ा मुख्य पर रखेगा कंटेनर, – osayilgan

+0

जिसका अर्थ है कि मैंने पहले टैब में बनाए गए सभी डेटा हटा दिए जाएंगे और दूसरे खंड के साथ प्रतिस्थापित किया जाएगा? अगर मैं पहले टैब पर वापस आऊंगा तो क्या होगा? मैं इसे पुनर्जीवित कर दूंगा? उत्तर के लिए – osayilgan

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