2011-11-14 5 views
6

क्या कई गतिविधियों में समान विकल्प मेनू विकल्प दिखाने का कोई सुविधाजनक तरीका है?विकल्प मेनू कोड का पुन: उपयोग

उदाहरण: मेरे ऐप में, मैं तीन तरीकों में से एक में एक टीवी गाइड प्रदर्शित करता हूं।

  1. सात दिन गाइड (7 टैब के साथ TabActivity)
  2. सभी चैनल 'अब दिखा' (ListActivity)
  3. सभी शो आज प्रारंभ समय के अनुसार (गतिविधि - ListActivity को आसानी से बदला जा सकता है)

TabActivity में विकल्प मेनू के लिए, कोड काफी सरल है ...

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    menu.clear(); 
    inflater.inflate(R.menu.gv_options_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.view: 
     ... 
    ... 
    } 
} 

... ख इस समय ऐसा लगता है कि मुझे इसे दो अन्य क्रियाओं में कॉपी/पेस्ट करने की आवश्यकता है जो मुझे पसंद नहीं है। यदि मैं एक के लिए विकल्प मेनू कोड बदलता हूं तो मुझे इसे अन्य दो के लिए भी करना होगा।

एकमात्र विकल्प मैं सोच सकता हूं कि मेरे पास एक 'सहायक' वर्ग (पीओजेओ) है जिसमें मैं एक विधि जोड़ सकता हूं और विधि के उपयोग की अनुमति देने के लिए context पास कर सकता हूं और एक अन्य विधि जिसके परिणामस्वरूप मैं परिणाम दे सकता हूं स्विच-केस के साथ प्रक्रिया करने के लिए item.getItemId()

समान विकल्प मेनू के साथ कई गतिविधियां करने का सामान्य तरीका क्या है?

उत्तर

5

एक दृष्टिकोण आपकी गतिविधियों के साथ विरासत का उपयोग करना है। एक बेस गतिविधि बनाएं जो विकल्प मेनू विधियों को लागू करती है और फिर प्रत्येक बच्चे गतिविधि उस कार्यक्षमता को प्राप्त करेगी।

युक्ति:: यह केवल Android डेवलपर साइट पर recommended approach है आपके आवेदन कई गतिविधियों में शामिल है और उनमें से कुछ एक ही विकल्प मेनू प्रदान करते हैं, एक गतिविधि है कि onCreateOptionsMenu() और onOptionsItemSelected छोड़कर कुछ भी नहीं लागू करता है बनाने पर विचार करें() तरीकों। फिर प्रत्येक गतिविधि के लिए इस कक्षा का विस्तार करें जो समान विकल्प मेनू साझा करना चाहिए। इस तरह, आपको मेनू क्रियाओं को संभालने के लिए कोड का केवल एक सेट प्रबंधित करना होगा और प्रत्येक वंश वर्ग को मेनू व्यवहार प्राप्त होगा।

दुर्भाग्य से यह आपके लिए काम नहीं करेगा क्योंकि आप गतिविधि से विरासत में नहीं हैं बल्कि इसके उप-वर्गों को अलग करते हैं, लेकिन यह करने का 'सामान्य' तरीका है।

+0

जैसा कि यह निकला कि मैं भूल रहा था कि 7 दिन की मार्गदर्शिका गतिविधि की टैब सामग्री वास्तव में सूचीत्मकताएं हैं - मैंने 'आज सभी शो ...' गतिविधि बदल दी है (मेरे प्रश्न में गतिविधि 3) भी ListActivity और एक बेस क्लास परिभाषित किया गया है जो सभी तीन अब विस्तारित है। पेड़ों के लिए जंगल को देखने में सक्षम नहीं होने के उन क्षणों में से एक। धन्यवाद। – Squonk

10

इन दोनों तरीकों के साथ एक सरल अलग वर्ग बनाएँ:

public class MyMenuHandler { 

    private Activity mActivity; 

    public MyMenuHandler(Activity activity) { 
     mActivity = activity; 
    } 

    public boolean onPrepareOptionsMenu(Menu menu) { 
     MenuInflater inflater = mActivity.getMenuInflater(); 
     menu.clear(); 
     inflater.inflate(R.menu.gv_options_menu, menu); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.view: 
      ... 
     } 
    } 
} 

अपनी गतिविधियों में उन कॉलबैक तरीकों को ओवरराइड करने और अपने MyMenuHandler वर्ग का एक उदाहरण के लिए कॉल रीडायरेक्ट:

public class MyActivity1 extends TabActivity { 

    private MyMenuHandler mMenuHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     mMenuHandler = new MyMenuHandler(this); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // you may also add here some items which are specific 
     // for one activity, not for the others 
     ... 
     return mMenuHandler.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle selection of your specific items here, 
     // if none of them has been selected call mMenuHandler method 
     ... 
     return mMenuHandler.onOptionsItemSelected(item); 
    } 
} 

यह दूँगी आप एक ही स्थान पर कोड डालते हैं जो आपके मूल मेनू आइटमों के चयन का जवाब देता है, इसलिए उसी मेनू में सभी गतिविधियों को कॉपी-पेस्ट करने की चिंता करने की आवश्यकता नहीं होगी।

+0

बिल्कुल सही ए.एच. दोस्त। –

2

आप अपने क्रिया मेनू को fragment में समाहित कर सकते हैं। इस तरह आपको केवल अपनी गतिविधि के ऑनरेट मेनू में खंड जोड़ने की आवश्यकता है।

एक बार टुकड़ा बनने के बाद आपको setHasOptionsMenu पर कॉल करने की आवश्यकता है। ऐड खंड जोड़ने के लिए लेआउट आईडी के बजाय एक टैग का उपयोग करें।

+0

हाय। क्या आपके पास इसके लिए कोई अच्छा उदाहरण (ट्यूटोरियल या कोई उदाहरण है)? टुकड़ा मेरे लिए काफी नया है। – xDragonZ

+0

इस http://developer.android.com/guide/topics/fundamentals/fragments.html – Janusz

+0

से शुरू करें ध्यान दें कि यह लागू है यदि आप API स्तर 11 या अधिक –