ফ্র্যাগমেন্ট অ্যাকশনবারকম্প্যাটটির অভ্যন্তরীণ থেকে সাপোর্টঅ্যাকশনবারটি পান


106

আমি একটি নতুন প্রকল্প শুরু করছি যা 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

          //...
    }

এটি ব্যবহারের জন্য গুগল পৃষ্ঠা ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) বলছে v4খণ্ডের জন্য কোনও পরিবর্তন করা উচিত নয় । আমাকে কি আমার সমস্ত getActivity()কল কাস্ট করতে হবে ActionBarActivity? এটি দেখতে খারাপ ডিজাইনের মতো।

উত্তর:


290

ফ্রেগমেন্ট.অনঅ্যাক্টিভিটি ক্রিয়েটেড ( ...) এর পরে আপনার getActivity () এর মাধ্যমে অ্যাক্সেসযোগ্য একটি বৈধ কার্যকলাপ থাকবে।

আপনাকে এটিকে একটি অ্যাকশনবার্টিভিটিতে কাস্ট করতে হবে তারপরে কলটি সাপোর্টঅ্যাকশনবার () এ কল করুন।

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

আপনার অভিনেতার দরকার নেই এটি দুর্বল ডিজাইন নয়, এটি পিছনের সামঞ্জস্য।


4
ধন্যবাদ আমি আশা করছিলাম যে এটির উত্তর হবে না। আমি আশা করছিলাম যে getActionBar () একটি ভি 7 অ্যাকশনবারটি ফিরিয়ে দেবে যা আমার অতিরিক্ত কার্যকারিতা প্রয়োজন হলে আমি নিক্ষেপ করব। এখন আমার খণ্ডগুলিকে কী ধরণের কার্যকলাপে তারা হোস্ট করা উচিত তা সম্পর্কে সচেতন হতে হবে
— পল

না এটি হ'ল না কারণ getActionBar () এমন একটি ক্রিয়াকলাপ API যা এসডিকে (প্রাক-মধুচক্র) এর পুরানো সংস্করণে বিদ্যমান নেই। এ কারণেই আমাদের সমর্থন ক্লাসগুলির প্রয়োজন যা নতুন এবং উন্নত শ্রেণি এবং এপিআই-র সাম্প্রতিক সাম্প্রতিক এসডিকে কার্যকারিতা আয়না করে।
— পিয়েরে-আন্তোইন লাফায়েট

@ পিয়েরে-এন্টোইনলএফায়েট কেন অনাটাচ () এ এটি করতে হবে? এটি অ্যাক্টিভিটি ক্রেইটেড () এ আরও ভাল হবে না?
— ইগোরগানাপলস্কি

হ্যাঁ যেহেতু সাপোর্টঅ্যাকশনবার () পাওয়ার প্রথম কলটি ক্রিয়াকলাপের মতামতগুলি অনুসন্ধান করে অ্যাকশনবারার সূচনা করবে, তাই এই কলটি অন্যাক্টিভিটিক্রিটযুক্ত () এ করা সম্ভবত ভাল। আমি আরও বেশি ইঙ্গিত করার চেষ্টা করছিলাম যে খণ্ডটির কোনও ক্রিয়াকলাপ না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হবে। আমি উত্তর আপডেট করব।
— পিয়েরে-আন্তোইন লাফায়েট

4
অ্যাকশনবার অ্যাক্টিভিটির পরিবর্তে অ্যাপকম্প্যাটএ্যাকটিভিটি ব্যবহার করুন
— অপরাজিতা সিনহা

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()mImplঅ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে অবজেক্ট তৈরি করে ।
  • 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;
}

4
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

পিয়েরে-আন্তোইন লাফেটের উত্তরের আপডেট হওয়া উত্তর হিসাবে

অ্যাকশনবার অ্যাক্টিভিটি অবচয় করা হয়েছে; AppCompatActivityপরিবর্তে ব্যবহার করুন

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

5

কোটলিন ব্যবহারকারীদের জন্য,

(activity as AppCompatActivity).supportActionBar.setSubtitle(R.string.subtitle)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.