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


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.