Fragment ActionBarCompat के अंदर से getSupportActionBar


102

मैं एक नई परियोजना शुरू कर रहा हूं जो समर्थन पुस्तकालय AppCompat/ActionBarCompatमें उपयोग करता है v7। मैं यह पता लगाने की कोशिश कर रहा हूं कि getSupportActionBarखंड के भीतर से कैसे उपयोग किया जाए । टुकड़ा को होस्ट करने वाली मेरी गतिविधि का विस्तार होता है ActionBarActivity, लेकिन मुझे फ़्रैगमेंट के लिए एक समान समर्थन वर्ग नहीं दिखता है।

मेरे टुकड़े के भीतर से

    public class CrimeFragment extends Fragment {
          //...

          getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment

          //...
    }

इसका उपयोग करने के लिए Google पेज ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) का कहना है कि v4टुकड़े के लिए कोई बदलाव नहीं होना चाहिए । क्या मुझे अपने सभी getActivity()कॉल को एक में डालने की आवश्यकता है ActionBarActivity? जो खराब डिजाइन की तरह लगता है।

जवाबों:


287

Fragment.onActivityCreated (...) के बाद आपको getActivity () के माध्यम से एक वैध गतिविधि सुलभ होगी।

आपको इसे ActionBarActivity को कास्ट करने की आवश्यकता होगी, फिर कॉल करने के लिए getSupportActionBar () करें।

((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);

आपको कलाकारों की जरूरत है। यह खराब डिजाइन नहीं है, यह पश्चगामी संगतता है।


3
धन्यवाद। मुझे उम्मीद थी कि इसका जवाब नहीं होगा। मैं उम्मीद कर रहा था कि getActionBar () एक v7 ActionBar लौटाएगा जो कि अगर मुझे अतिरिक्त कार्यक्षमता की आवश्यकता है, तो मैं डालूंगा। अब मेरी टुकड़े गतिविधि कि वे किस प्रकार में होस्ट किया गया है के बारे में पता होना चाहिए।
पॉल

यह नहीं है क्योंकि getActionBar () एक गतिविधि API है जो SDK (प्री-हनीमून) के पुराने संस्करणों पर मौजूद नहीं है। यही कारण है कि हमें समर्थन वर्गों की आवश्यकता है जो नए और बेहतर कक्षाओं की कार्यक्षमता को और अधिक हाल के एसडीके में एपीआई को प्रतिबिंबित करते हैं।
पियरे-एंटोनी लाफैटे

@ पियरे-एंटोनीलेफाएट को ऑनआटच () में क्यों करना पड़ता है? यह onActivityCreated () में बेहतर नहीं होगा?
इगोरगानापोलस्की

हां क्योंकि getSupportActionBar () की पहली कॉल गतिविधि में विचारों को देखते हुए ActionBar को इनिशियलाइज़ कर देगी, संभवतः इस कॉल के लिए onActivityCreated () किया जाना बेहतर है। मैं और अधिक केवल यह संकेत देने की कोशिश कर रहा था कि आपको तब तक इंतजार करना होगा जब तक कि टुकड़ा की गतिविधि न हो। मैं जवाब अपडेट कर दूंगा।
1938 में पियरे-एंटोनी लाफेटे

2
ActionBarActivity के बजाय AppCompatActivity का उपयोग करें
अपराजिता सिन्हा

37

हालांकि यह सवाल पहले से ही स्वीकार किए जाते हैं जवाब है, मैं बाहर बिंदु चाहिए कि यह पूरी तरह से सही नहीं है: बुला getSupportActionBar()से Fragment.onAttach()एक कारण होगा NullPointerExceptionजब गतिविधि घुमाया जाता है।

संक्षिप्त जवाब:

का प्रयोग करें ((ActionBarActivity)getActivity()).getSupportActionBar()में onActivityCreated()(या किसी भी अपने जीवन चक्र में बाद में बात) के बजाय onAttach()

लंबा जवाब:

कारण यह है कि यदि ActionBarActivityरोटेशन के बाद इसे फिर से बनाया गया है, तो यह वास्तव में ऑब्जेक्ट बनाने से पहले सभी फ्रेगमेंट को पुनर्स्थापित करेगा ActionBar

पुस्तकालय ActionBarActivityमें स्रोत कोड support-v7:

@Override
protected void onCreate(Bundle savedInstanceState) {
    mImpl = ActionBarActivityDelegate.createDelegate(this);
    super.onCreate(savedInstanceState);
    mImpl.onCreate(savedInstanceState);
}
  • ActionBarActivityDelegate.createDelegate()mImplAndroid संस्करण के आधार पर ऑब्जेक्ट बनाता है ।
  • super.onCreate()है FragmentActivity.onCreate()जो एक रोटेशन (के बाद किसी भी पिछले टुकड़े पुनर्स्थापित करता है, FragmentManagerImpl.dispatchCreate(), और ग)।
  • mImpl.onCreate(savedInstanceState)है ActionBarActivityDelegate.onCreate(), जो mHasActionBarविंडो शैली से चर को पढ़ता है।
  • पहले mHasActionBarसच है, getSupportActionBar()हमेशा वापस आ जाएगा null

इसके लिए स्रोत ActionBarActivityDelegate.getSupportActionBar():

final ActionBar getSupportActionBar() {
    // The Action Bar should be lazily created as mHasActionBar or mOverlayActionBar
    // could change after onCreate
    if (mHasActionBar || mOverlayActionBar) {
        if (mActionBar == null) {
            ... creates the action bar ...
        }
    } else {
        // If we're not set to have a Action Bar, null it just in case it's been set
        mActionBar = null;
    }
    return mActionBar;
}

2
ActionBarActivityपदावनत किया गया है। AppCompatActivityइसके बजाय का उपयोग करें
समन सत्तारी

29

अगर कोई com.android.support:appcompat-v7: और AppCompatActivity को गतिविधि के रूप में उपयोग करता है तो यह काम करेगा

((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);

5

समर्थन पुस्तकालय से अपने fragment.xmlऐड Toolbarटैग में

 <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

अब हम इसे MyFragmentकक्षा से कैसे नियंत्रित कर सकते हैं ? चलो देखते हैं

अंदर onCreateViewसमारोह निम्नलिखित जोड़ें

mToolbar = (Toolbar) view.findViewById(R.id.toolbar);
((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);

//add this line if you want to provide Up Navigation but don't forget to to 
//identify parent activity in manifest file
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

और आप जोड़ना चाहते हैं तो itemsटूलबार में भीतर MyFragment आप mustइस लाइन के अंदर जोड़ने onCreateViewसमारोह

        setHasOptionsMenu(true);

यह पंक्ति महत्वपूर्ण है, यदि आप इसे भूल जाते हैं, तो एंड्रॉइड आपके मेनू आइटम को पॉप्युलेट नहीं करेगा।

मान लें कि हम उन्हें पहचानते हैं menu/fragment_menu.xml

उसके बाद निम्नलिखित कार्यों को ओवरराइड करें

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

उम्मीद है की यह मदद करेगा


5

पियरे-एंटोनी लैफेट के उत्तर के लिए एक अद्यतन उत्तर के रूप में

ActionBarActivity को हटा दिया गया है; AppCompatActivityइसके बजाय का उपयोग करें

((AppCompatActivity)getActivity()).getSupportActionBar();

3

कोटलिन का उपयोग करने वालों के लिए,

(activity as AppCompatActivity).supportActionBar.setSubtitle(R.string.subtitle)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.