2009-10-19 10 views
10

हम एक ऐप लिखने की प्रक्रिया में हैं जिसमें 4 टैब हैं: मानचित्र, लोग, स्थान, घटनाक्रम। ऐप में लोग, स्थान और घटनाएं मानचित्र पर आइकन के रूप में दिखाई देती हैं। डिफ़ॉल्ट रूप से लोग, स्थान और ईवेंट टैब प्रत्येक क्रमशः सभी लोगों, स्थानों और घटनाओं को प्रदर्शित करते हुए एक सूचीदृश्य, कस्टम प्रस्तुत करते हैं।एंड्रॉइड - टैब, मैप व्यू, टैब के भीतर गतिविधियां

alt text http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png

अब, सही टैब की अब प्रत्येक अपनी सामग्री के रूप में संगत गतिविधि शुरू करने के लिए एक आशय सेट है। उदाहरण के लिए, एक MapTabActivity है जो MapActivity, एक ShowPeopleListActivity को बढ़ाती है जो लोगों को दिखाती है, और इसी तरह से आगे।

मैं देख रहा हूँ एक lotofStackOverflowquestions/उत्तर कह रही है कि रास्ते में विभिन्न सीमाओं के कारण TabHost सेटअप है, यह टैब की सामग्री के रूप में उपयोग करने के लिए गतिविधियों नहीं सबसे अच्छा है। उदाहरण के लिए, एक नई गतिविधि लॉन्च करना असंभव है और यह एक टैब के भीतर मौजूदा गतिविधि की जगह ले लेता है, जबकि एक दृश्य को एक अलग दृश्य के साथ स्विच करना संभव है।

अब, मैं एक चौराहे पर हूं। हमने (बेहतर या बदतर के लिए) इस ऐप को वर्तमान में संरचित तरीके से काम करने के लिए एक उचित समय समर्पित किया है, जिसमें टैब की सामग्री के रूप में गतिविधियां हैं। जब किसी व्यक्ति, प्लेस या इवेंट से संबंधित आइकन क्लिक किया जाता है, तो वह उस ऑब्जेक्ट से संबंधित यूआरआई पर एक दृश्य उद्देश्य को बंद कर देता है; यह एक गतिविधि द्वारा उठाया जाता है जो तब वस्तु को दिखाता है। मानचित्र और व्यक्तिगत सूचियों में दोनों ही कार्य एक ही काम पर हैं। हम वास्तव में ढीले युग्मन को पसंद करते हैं जो हमें प्रदान करता है; हम सिर्फ एक दृश्य आदेश और यूआरआई व्यक्ति/स्थान/घटना के लिए देते हैं और यह स्वचालित रूप से हमें सही गतिविधि में लाता है। अनुमोदित, जिस गतिविधि को लॉन्च किया गया है, उसके अंदर दिखाई देने के बजाय टैब दृश्य को शामिल करता है, लेकिन हम इसके साथ रहने के लिए तैयार थे।

यहां एक समस्या है हालांकि: शो गतिविधि से, हम उस व्यक्ति, स्थान या घटना पर केंद्रित मानचित्र पर वापस जाने में सक्षम होना चाहते हैं। हम मानचित्र को फिर से दिखाने के लिए एक नई गतिविधि लॉन्च कर सकते हैं, लेकिन अब हमारे पास टैब की सामग्री के रूप में नक्शा गतिविधि है, साथ ही शो गतिविधि, और गतिविधि स्टैक में नई मानचित्र गतिविधि; यह देखते हुए कि संसाधन गतिविधि गहन संसाधन कैसे है, मुझे लगता है कि यह जाने का आदर्श तरीका नहीं है।

मुझे लगता है कि मेरा सवाल है, क्या कोई अच्छा ट्यूटोरियल कहीं दिखा रहा है कि टैबहोस्ट के साथ जटिल कार्य कैसे करें? मैंने HelloTabWidget देखा है; मैं इससे कुछ ज्यादा परिष्कृत खोज रहा हूं। मुझे चिंता है कि अगर हम चीजों को करने के दृश्य आधारित तरीके पर स्विच करते हैं, तो हमें सभी पिछली घटनाओं को रोकने, विचारों को बदलने की कोशिश इत्यादि के साथ-साथ घर के रख-रखाव के लिए बहुत कुछ करना होगा, साथ ही साथ दृढ़ता से हमारे कार्यक्रम को एक तरह से जोड़ना जो हम नहीं चाहते हैं।

किसी भी तरीके से आगे के सुझावों की अत्यधिक सराहना की जाएगी। हम एंड्रॉइड के लिए नए हैं इसलिए हम स्थापित सर्वोत्तम प्रथाओं का पालन करने की कोशिश कर रहे हैं, लेकिन यह मुश्किल है जब हमने देखा कि कुछ उदाहरण हमारे उपयोग के मामले के लिए बहुत सरल हैं।

उत्तर

7

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

एंटी-एक्टिविटी-टैब एलायंस (एएटीए) के स्वयं नियुक्त राष्ट्रपति के रूप में, यह निश्चित रूप से मेरी स्थिति है।

जब एक व्यक्ति, स्थान, या घटना के लिए इसी एक आइकन क्लिक किया जाता है, यह यूआरआई उस वस्तु के लिए इसी पर एक दृश्य के आशय बंद आग; यह एक गतिविधि द्वारा उठाया गया है जो ऑब्जेक्ट दिखाता है।

ध्यान दें कि टैब की सामग्री के रूप में गतिविधियों के साथ इसका कोई लेना-देना नहीं है।

हम फिर से नक्शा दिखाने के लिए एक नई गतिविधि शुरू कर सकते हैं, लेकिन अब हम गतिविधि स्टैक में टैब, की सामग्री के साथ साथ शो गतिविधि, के साथ साथ नए नक्शा गतिविधि के रूप में नक्शे गतिविधि है ; ने बताया कि संसाधन गतिविधि को गहन संसाधन कैसे दिया गया है, मुझे लगता है कि यह जाने का आदर्श तरीका नहीं है।

यदि संभव हो तो मैं इससे बचूंगा।

मुझे चिंता है कि अगर हम काम करने के देखें आधारित तरीका करने के लिए स्विच, हम अवरोधन सब वापस घटनाओं के लिए गृह व्यवस्था की एक बहुत करना होगा हूँ, विचारों बाहर स्विच करने की कोशिश , इत्यादि, आदि, के रूप में अच्छी तरह से हमारे प्रोग्राम को दृढ़ता से जोड़ना जो हम नहीं चाहते हैं।

यह आपके द्वारा पहले लिखा गया सब कुछ नहीं है। आपकी "पिछली घटनाएं" टैबों की सामग्री के रूप में दृश्यों का उपयोग करने और टैब की सामग्री के रूप में क्रियाओं का उपयोग करने के बीच एक Iota को नहीं बदलेगी। इसके अलावा, आपके पास वर्णित "ढीले युग्मन" पैटर्न के साथ कुछ भी नहीं है - किसी टैब में किसी दृश्य में किसी सूची में किसी आइकन पर क्लिक करना किसी गतिविधि में किसी आइकन में किसी आइकन में क्लिक करने से अलग नहीं होता है एक टैब।

बस अपनी शो गतिविधि को अपने, um, मुख्य गतिविधि को एक विशेष स्थान दिखाने के लिए बताएं, फिर शो गतिविधि finish() हो सकती है। गतिविधियों के बीच एक कठिन जेवीएम युग्मन शुरू किए बिना ऐसा करने का सबसे आसान तरीका है Intent प्रसारित करना और मुख्य गतिविधि में BroadcastReceiver पंजीकृत करना। इस Intent की प्राप्ति के बाद, मुख्य गतिविधि मानचित्र को अपडेट करेगी और इसे वर्तमान टैब के रूप में सेट करेगी। बेशक, यह दृष्टिकोण सरल है यदि आपके पास मुख्य टैब उपयोग टैब टैब के लिए दृश्य का उपयोग करता है।

अब, यदि आप अपने आवेदन को ओवरहाल करने का प्रयास करते हैं, जैसे कि टैब में नेविगेट करना एक और गतिविधि लॉन्च नहीं करता है, बल्कि चीजों को अपने टैब में रखता है ... यह मछली का एक संपूर्ण 'पोषक केतली है।

+0

ठीक है, मैं आपका मुद्दा देखता हूं कि यदि हम सभी इरादों को उसी तरह स्थापित करते हैं, और शो गतिविधि लॉन्च की जाती है, तो पिछली घटनाओं को ठीक उसी तरह से संभाला जाता है। तो मुझे लगता है कि असली जटिलता (और पिछला घटना दर्द) होगा यदि हम प्रोग्राम किए गए रूप से लॉन्च किए गए इरादे के बजाय टैब की सामग्री को स्विच करते हैं। जैसे लोग टैब जो आम तौर पर लोगों की सूची प्रदर्शित करता है उसे किसी व्यक्ति को क्लिक किए जाने पर व्यक्ति को देखने के लिए स्विच करने के लिए कहा जाता है। उस स्थिति में हमें अपने विचारों के ढेर से निपटना होगा? – I82Much

+0

इसके अलावा, किसी टैब की सामग्री के बिना गतिविधि के बिना किसी टैब के अंदर नक्शा कैसे हो सकता है? क्या यह संभव है? – I82Much

+0

w/r/t आपकी पहली टिप्पणी, हां, आपको अपना खुद का ढेर प्रबंधन करना होगा। w/r/t आपकी दूसरी टिप्पणी, हाँ आप AFAIK कर सकते हैं। अपनी मुख्य गतिविधि को टैबएक्टिविटी की बजाय मानचित्र क्रियाशीलता बनाएं। आपके लिए TabActivity केवल एक ही चीज है जो आपके टैबहोस्ट पर स्वचालित रूप से कॉल सेटअप() है, जिसे आपको किसी भी टैबस्पेक्स जोड़ने से पहले स्वयं को करने की आवश्यकता होगी। फिर, MapActivity आपको मानचित्र को एक टैब में डालने के लिए आवश्यक बनाता है। यह संभव है कि यहां समस्याएं हैं, लेकिन कफ से मुझे लगता है कि इसे ठीक काम करना चाहिए। – CommonsWare

8

यह एक अच्छा अभ्यास है कि आपके टैब के लिए एक गतिविधि और एकाधिक विचार हों। हालांकि, इसका मतलब यह है कि आप को संभालने के लिए जो टैब चयनित है, प्रत्येक टैब दृश्य के लिए अलग अलग मेनू और संदर्भ मेनू में सावधान रहना होगा, आदि

मुझे लगता है, मेरे सवाल यह है कि वहाँ एक अच्छा ट्यूटोरियल कहीं दिखा TabHost के साथ जटिल कार्य कैसे करें? मैंने HelloTabWidget देखा है; मैं कुछ और अधिक इस से परिष्कृत खोज रहा हूं।

मैंने अपने ब्लॉग पर थोड़ा बेहतर ट्यूटोरियल लिखा जो एक इंटरैक्टिंग लिस्ट व्यू और मैप व्यू को टैब के रूप में प्रदर्शित करता है। यहाँ लिंक है: Android Tabs with interacting map and list views

मूल बातें, एक लेआउट HelloTabWidget ट्यूटोरियल से मिलता-जुलता है अपनी गतिविधि MapActivity से विस्तार कर, एक्सएमएल से tabhost निकालने और सुनिश्चित करें कि आपने() tabhost पर कॉल करने के लिए है। उसके बाद, टैब, टैब श्रोताओं आदि की सामग्री के रूप में विचार जोड़ना वही है।

यहाँ वर्ग के लिए एक संक्षिप्त प्रारंभिक बिंदु है:

public class TabbedListMapActivity extends MapActivity { 

private ListView listView; 
private MapView mapView; 

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

    tabHost = (TabHost) findViewById(android.R.id.tabhost); 

    // setup must be called if not a TabActivity 
    tabHost.setup(); 

    // setup list view 
    listView = (ListView) findViewById(R.id.list); 

    // setup map view 
    mapView = (MapView) findViewById(R.id.mapview); 

    // add views to tab host 
    tabHost.addTab(tabHost.newTabSpec("List").setIndicator("List").setContent(new TabContentFactory() { 
     public View createTabContent(String arg0) { 
      return listView; 
     } 
    })); 
    tabHost.addTab(tabHost.newTabSpec("Map").setIndicator("Map").setContent(new TabContentFactory() { 
     public View createTabContent(String arg0) { 
      return mapView; 
     } 
    })); 
} 

...

+0

अब, यह एक अच्छा जवाब है! धन्यवाद जोश, आपने मेरा दिन बचाया। –

1

उदाहरण के लिए, यह लांच एक नई गतिविधि के लिए असंभव है और यह ले मौजूदा की जगह नहीं है एक टैब के भीतर गतिविधि , जबकि यह संभव है एक अलग व्यू के साथ एक व्यू स्विच करें।

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

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

  • कोई संबंधित समस्या नहीं^_^