সমর্থন লাইব্রেরি ব্যবহার না করে অ্যান্ড্রয়েড 4.0.০, ৪.১ (<4.2) এ নেস্টেড টুকরো জন্য সেরা অনুশীলন


115

আমি 4.0 এবং 4.1 ট্যাবলেটগুলির জন্য একটি অ্যাপ লিখছি, যার জন্য আমি সমর্থন লাইব্রেরিগুলি (প্রয়োজন না হলে) ব্যবহার করতে চাই না তবে কেবলমাত্র 4.x এপিআই ap

সুতরাং আমার লক্ষ্য প্ল্যাটফর্মটি খুব ভাল হিসাবে সংজ্ঞায়িত হয়েছে:> = 4.0 এবং <= 4.1

অ্যাপ্লিকেশনটিতে একটি বহু-ফলক বিন্যাস রয়েছে (দুটি টুকরা, একটি বামদিকে ছোট, ডানদিকে একটি সামগ্রীর টুকরা) এবং ট্যাব সহ অ্যাকশন বার।

এর মতো:

এখানে চিত্র বর্ণনা লিখুন

অ্যাকশন বারে একটি ট্যাব ক্লিক করা 'বাহ্যিক' টুকরা পরিবর্তন করে এবং এর অভ্যন্তরের টুকরাটি তখন দুটি নেস্টেড টুকরা (১. ছোট বাম তালিকার খণ্ড, ২. প্রশস্ত সামগ্রীর খণ্ড) সহ একটি খণ্ড।

আমি এখন ভাবছি টুকরো টুকরা এবং বিশেষত নেস্টেড টুকরো প্রতিস্থাপনের সেরা অনুশীলন কোনটি? ভিউপ্যাজারটি সমর্থন লাইব্রেরির অংশ, এই শ্রেণীর জন্য কোনও দেশীয় 4.x বিকল্প নেই। আমার অর্থে 'অবচয়' হওয়ার জন্য উপস্থিত হন। - http://developer.android.com/references/android/support/v4/view/ViewPager.html

তারপরে আমি অ্যান্ড্রয়েড ৪.২ এর জন্য প্রকাশিত নোটগুলি পড়লাম ChildFragmentManager, যা ভাল ফিট হবে তবে আমি ৪.০ এবং ৪.১ লক্ষ্য করছি, সুতরাং এটিও ব্যবহার করা যাবে না।

ChildFragmentManager শুধুমাত্র 4.2 এ উপলব্ধ

দুর্ভাগ্যক্রমে, এখানে খুব ভাল কোনও উদাহরণ পাওয়া যায় যা সমর্থন লাইব্রেরি ছাড়াই টুকরো টুকরো ব্যবহারের সর্বোত্তম অনুশীলন দেখায়, এমনকি পুরো অ্যান্ড্রয়েড বিকাশকারী গাইডগুলিতেও; এবং বিশেষভাবে নেস্টেড টুকরা সম্পর্কিত কিছুই।

তাই আমি ভাবছি: সমর্থন লাইব্রেরি এবং এর সাথে উপস্থিত সমস্ত কিছু না ব্যবহার করে নেস্টেড টুকরা সহ 4.1 অ্যাপ্লিকেশন লেখা কি সম্ভব নয়? (টুকরা ইত্যাদির পরিবর্তে ফ্র্যাগমেন্টএকটিভিটি ব্যবহার করা দরকার?) অথবা সর্বোত্তম অনুশীলনটি কী হবে?


আমি বর্তমানে বিকাশে যে সমস্যাটি করছি তা হ'ল এই বক্তব্য:

অ্যান্ড্রয়েড সমর্থন লাইব্রেরি এখন নেস্টেড টুকরাগুলিকে সমর্থন করে, তাই আপনি অ্যান্ড্রয়েড ১. and এবং এর চেয়ে বেশি এর উপরে নেস্টেড টুকরা ডিজাইনগুলি প্রয়োগ করতে পারেন।

দ্রষ্টব্য: আপনি যখন কোনও লেআউটে একটি টুকরো টুকরো টুকরো টুকরো টানতে পারেন <fragment>। নেস্টেড টুকরোগুলি কেবল তখনই কার্যকর হয় যখন গতিশীলভাবে কোনও খণ্ডে যুক্ত করা হয়।

কারণ আমি XML এ নেস্টেড টুকরাগুলি সংজ্ঞায়িত করেছি, যা আপাতদৃষ্টিতে ত্রুটির কারণ হয়:

Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_

এই মুহুর্তে, আমি নিজের জন্য সিদ্ধান্ত নিই: এমনকি ৪.১-তে, যখন আমি ২.x প্ল্যাটফর্মকেও লক্ষ্য করতে চাই না, স্ক্রিনশটে প্রদর্শিত নেস্টেড টুকরো সমর্থন লাইব্রেরি ছাড়া সম্ভব নয়।

(এটি আসলে কোনও প্রশ্নের চেয়ে উইকি এন্ট্রি বেশি হতে পারে তবে এর আগে অন্য কেউ এটি পরিচালনা করেছেন)।

হালনাগাদ:

একটি সহায়ক উত্তর হ'ল ফ্রেগমেন্ট ইনসাইড ফ্রেগমেন্ট


22
আপনার কাছে তিনটি বিকল্প রয়েছে: ১. স্থানীয় নেস্টেড টুকরোগুলি সহ কেবলমাত্র ৪.২ টার্গেট করুন। ২. সমর্থন লাইব্রেরি থেকে নেস্টেড টুকরা সহ 4.x টার্গেট করুন 3. অন্য কোনও প্ল্যাটফর্ম টার্গেটের দৃশ্যের জন্য নেস্টেড টুকরো ব্যবহার করবেন না। এটিতে আপনার প্রশ্নের উত্তর দেওয়া উচিত A এছাড়াও, আপনি এক্সএমএল লেআউটে এমবেড হওয়া নেস্টেড টুকরা ব্যবহার করতে পারবেন না, সেগুলি অবশ্যই কোডে যুক্ত করা উচিত। সমর্থন লাইব্রেরি ছাড়াই টুকরো টুকরো টুকরো ব্যবহারের জন্য সর্বোত্তম অনুশীলনগুলি খুব কমই পাওয়া যায় - সমর্থন খণ্ডের কাঠামোটি দেশীয়টির প্রতিরূপ তৈরি করে তাই কোনও উদাহরণই সেভাবে কাজ করা উচিত।
Luksprog

@ লুক্সপ্রোগ আপনার মন্তব্যের জন্য ধন্যবাদ। আমি আপনার সমাধান 2 পছন্দ করি এবং ফ্রেমগুলি সমর্থন লাইব্রেরিতে ভালভাবে কাজ করে, তবে অ্যাকশনবারের ট্যাবগুলি না - আফিক্স, আমাকে অ্যাকশনবারেরলক ব্যবহার করা দরকার, তবে ট্যাবগুলি তখন অ্যাকশনবারের সাথে একত্রিত হবে না তবে কেবল নীচে (যা এটি 'নয়') 4.x এর জন্য টি প্রয়োজনীয়)। এবং অ্যাকশনবার.ট্যাবলিস্টনার কেবল android.app.Fraament থেকে টুকরো সমর্থন করে, সমর্থন লাইব্রেরি থেকে নয়।
ম্যাথিয়াস কনরাডেট

2
আমি গ্যালাক্সি ট্যাবে পরিচিতিগুলির সাথে পরিচিত নই তবে মনে রাখবেন যে আপনি সর্বদা ActionBar(স্যামসাং দ্বারা ঘরে নির্মিত) একটি কাস্টম প্রয়োগের মুখোমুখি হতে পারেন । অ্যাকশনবার শেরলকটি ঘনিষ্ঠভাবে দেখুন, যদি জায়গা থাকে তবে অ্যাকশনবারে এটির ট্যাব রয়েছে।
Luksprog

4
@ লুক্সপ্রোগ আমি বিশ্বাস করি যে আপনি ইতিমধ্যে দেওয়া একমাত্র উত্তরটি ইতিমধ্যে সরবরাহ করেছেন, আপনি কি যথাযথ উত্তর হিসাবে রাখলে কি দয়াবান হবেন?
ওয়ার্পজিট

1
@ শুয়োরপোকা এই প্রশ্নের মূল কারণ হ'ল: সমর্থন লাইব্রেরি এবং এটির অন্যান্য দর্শন উপাদানগুলি ব্যবহার না করে নেস্টেড টুকরাগুলির জন্য কোনও কার্যকারিতা রয়েছে? অর্থ, আমি যদি সমর্থন লাইব্রেরিতে স্যুইচ করি তবে আমি ফ্রেগমেন্টের পরিবর্তে ফ্র্যাগমেন্টএক্টিভিটি ব্যবহার করব। তবে আমি ফ্রেগমেন্টটি ব্যবহার করতে চাই না, যা চাই তা হ'ল নেস্টেড ফ্রেগমেন্টের প্রতিস্থাপন , তবে সমস্ত ভি 4 উপাদানই নয়। অর্থাত অন্যান্য ওপেন সোর্স লাইব্রেরি ইত্যাদির মাধ্যমে। উদাহরণস্বরূপ উপরের স্ক্রিনশটটি 4.0 এ চলেছে এবং আমি ভাবছি তারা এ বি এস, সাপোর্টলিব বা অন্য কিছু ব্যবহার করছে কিনা।
ম্যাথিয়াস কনরাডেট

উত্তর:


60

সীমাবদ্ধতা

সুতরাং আপনার কোনও সংস্করণ FragmentManagerব্যবহার না করেই এক্সএমএল দিয়ে অন্য খণ্ডের ভিতরে টুকরো টুকরো টুকরো করা সম্ভব নয় ।

সুতরাং আপনাকে কোডের মাধ্যমে টুকরোগুলি যোগ করতে হবে এটি এটিকে একটি সমস্যার মতো মনে হতে পারে তবে দীর্ঘ সময়ের মধ্যে আপনার লেআউটগুলি অতিমাত্রায় নমনীয় করে তোলে।

ব্যবহার না করে বাসা বাঁধছেন তো getChildFragmentManger? পেছনের childFragmentManagerসারমর্মটি হ'ল এটি পূর্ববর্তী খণ্ডের লেনদেন শেষ না হওয়া পর্যন্ত লোডিং স্থগিত করে। এবং অবশ্যই এটি স্বাভাবিকভাবেই 4.2 বা সমর্থন লাইব্রেরিতে সমর্থিত ছিল।

চাইল্ড ম্যানেজার ছাড়াই বাসা বাঁধন - সমাধান

সমাধান, অবশ্যই! আমি এখন দীর্ঘকাল ধরে এটি করছি, (যেহেতু এটি ViewPagerঘোষণা করা হয়েছিল)।

নিচে দেখ; এটি এমনটি যা Fragmentলোডিং স্থিত করে, তাই Fragmentএর ভিতরে এটি লোড করা যায়।

এটি খুব সহজ, এটি Handlerএকটি সত্যই কার্যকর শ্রেণি, কার্যকরভাবে হ্যান্ডলার বর্তমান খণ্ডটির লেনদেনের কাজ শেষ করার পরে মূল থ্রেডে সঞ্চালনের জন্য কোনও জায়গার জন্য অপেক্ষা করে (যে খণ্ডগুলি মূল থ্রেডে চালিত ইউআইতে হস্তক্ষেপ করে)।

// Remember this is an example, you will need to modify to work with your code
private final Handler handler = new Handler();
private Runnable runPager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    return inflater.inflate(R.layout.frag_layout, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    runPager = new Runnable() {

        @Override
        public void run()
        {
          getFragmentManager().beginTransaction().addFragment(R.id.frag_container, MyFragment.newInstance()).commit();
        }
    };
    handler.post(runPager);
}

/**
 * @see android.support.v4.app.Fragment#onPause()
 */
@Override
public void onPause()
{
    super.onPause();
    handler.removeCallbacks(runPager);
}

আমি এটিকে 'সেরা অনুশীলন' হিসাবে বিবেচনা করব না, তবে এই হ্যাকটি ব্যবহার করে আমার কাছে লাইভ অ্যাপ রয়েছে এবং এটি নিয়ে আমার এখনও কোনও সমস্যা নেই।

আমি পেজার এম্বেড করার জন্য এই পদ্ধতিটিও ব্যবহার করি - https://gist.github.com/chrisjenx/3405429


আপনি কীভাবে লেআউট নেস্টেড টুকরাগুলি পরিচালনা করবেন?
পাব্লিসকো

আমি এই কাজটি দেখতে পাবার একমাত্র উপায় হ'ল কাস্টমলআউটআইনফ্লেটার ব্যবহার করে আপনি যখন fragmentউপাদানটি জুড়ে আসবেন , আপনি সুপার প্রয়োগটি ওভাররাইড করবেন এবং এটিকে নিজেই বিশ্লেষণ / উত্সাহিত করার চেষ্টা করবেন। তবে এটি প্রচুর পরিশ্রম হবে, স্ট্যাকওভারফ্লো প্রশ্নের উত্তর খুব ভাল।
ক্রিস। জেনকিনস

হাই, এই সমস্যাটিতে কেউ আমাকে সহায়তা করতে পারে ?? আমি সত্যিই আটকে আছি .. stackoverflow.com/questions/32240138/…
নিকস

2

প্রি-এপিআই 17 এ করার সর্বোত্তম উপায় হ'ল এটি না করা। এই আচরণটি বাস্তবায়নের চেষ্টা করা সমস্যার কারণ হতে চলেছে। তবে এটি বলার অপেক্ষা রাখে না যে এটি বর্তমানের এপিআই 14 ব্যবহার করে দৃingly়তার সাথে নকল হতে পারে না I আমি যা করেছি তা নিম্নলিখিত ছিল:

1 - টুকরাগুলির মধ্যে যোগাযোগের দিকে তাকান http://developer.android.com/training/basics/fraament/communicating.html

2 - আপনার বিদ্যমান ফ্রেগমেন্ট থেকে ক্রিয়াকলাপ বিন্যাসে আপনার লেআউট এক্সএমএল ফ্রেমলআউটটি সরান এবং 0 এর উচ্চতা দিয়ে এটি আড়াল করুন:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent">
<FrameLayout android:id="@+id/content"
          android:layout_width="300dp"
          android:layout_height="match_parent" />


<FrameLayout android:id="@+id/lstResults"
             android:layout_width="300dp"
             android:layout_height="0dp"
             android:layout_below="@+id/content"
             tools:layout="@layout/treeview_list_content"/>


<FrameLayout android:id="@+id/anomalies_fragment"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
        android:layout_toRightOf="@+id/content" />

3 - অভিভাবক খণ্ডে ইন্টারফেসটি প্রয়োগ করুন

    OnListener mCallback;

// Container Activity must implement this interface
public interface OnListener 
{
    public void onDoSomethingToInitChildFrame(/*parameters*/);
    public void showResults();
    public void hideResults();
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnFilterAppliedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnListener");
    }
}

@Override
public void onActivityCreated(Bundle savedInstanceState) 
{
    super.onActivityCreated(savedInstanceState);

    mCallback.showResults();
}

@Override
public void onPause()
{
    super.onPause();

    mCallback.hideResults();
}

public void onClickButton(View view)
{
    // do click action here

    mCallback.onDoSomethingToInitChildFrame(/*parameters*/);
}

4 - পিতামাতার ক্রিয়াকলাপে ইন্টারফেসটি কার্যকর করুন

সর্বজনীন শ্রেণি আপনারঅ্যাক্টিভিটি প্রসারিত ক্রিয়াকলাপটি আপনার প্যারেন্টফ্র্যাগমেন্টটি প্রয়োগ করে nঅনলিস্টনার {

public void onDoSomethingToInitChildFrame(/*parameters*/)
{
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment childFragment = getFragmentManager().findFragmentByTag("Results");
    if(childFragment == null)
    {
        childFragment = new yourChildFragment(/*parameters*/);
        ft.add(R.id.lstResults, childFragment, "Results");
    }
    else
    {
        ft.detach(childFragment);

        ((yourChildFragment)childFragment).ResetContent(/*parameters*/);

        ft.attach(childFragment);
    }
    ft.commit();

    showResultsPane();
}

public void showResults()
{
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment childFragment = getFragmentManager().findFragmentByTag("Results");
    if(childFragment != null)
        ft.attach(childFragment);
    ft.commit();

    showResultsPane();
}

public void showResultsPane()
{
    //resize the elements to show the results pane
    findViewById(R.id.content).getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
    findViewById(R.id.lstResults).getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
}

public void hideResults()
{
    //resize the elements to hide the results pane
    findViewById(R.id.content).getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
    findViewById(R.id.lstResults).getLayoutParams().height = 0;

    FragmentTransaction ft = getFragmentManager().beginTransaction();
    Fragment childFragment = getFragmentManager().findFragmentByTag("Results");
    if(childFragment != null)
        ft.detach(childFragment);
    ft.commit();
}

}

5 - উপভোগ করুন, এই পদ্ধতির সাহায্যে আপনি প্রাক-এপিআই 17 এনভরওমেন্টে getChildFraamentManager () ফাংশন হিসাবে একই তরল কার্যকারিতা পাবেন। যেহেতু আপনি লক্ষ্য করেছেন যে শিশু খণ্ডটি প্রকৃতপক্ষে পিতামাত্রে খণ্ডের সন্তান নয় তবে এখন ক্রিয়াকলাপের শিশু, এটি সত্যই এড়ানো যায় না।


1

আমাকে নেভিগেশনড্রেয়ার, ট্যাবহোস্ট এবং ভিউপেজারের সংমিশ্রণের কারণে এই সঠিক সমস্যাটি মোকাবেলা করতে হয়েছিল যার ট্যাবহোস্টের কারণে সমর্থন লাইব্রেরি ব্যবহারে জটিলতা ছিল। এবং তারপরে আমাকে জেলিবিয়ান ৪.১ এর ন্যূনতম এপিআই সমর্থন করতে হয়েছিল, সুতরাং getChildFraamentManager সহ নেস্টেড টুকরা ব্যবহার করা কোনও বিকল্প ছিল না।

সুতরাং আমার সমস্যাটি এটিকে নিঃশেষ করা যায় ...

ট্যাবহোস্ট (শীর্ষ স্তরের জন্য)
+ ভিউপেজার (শীর্ষ স্তরের ট্যাবড টুকরোগুলির মধ্যে কেবল একটির জন্য)
= নেস্টেড টুকরাগুলির জন্য প্রয়োজন (যা জেলিবিয়ান 4.1 সমর্থন করবে না)

আমার সমাধানটি হ'ল প্রকৃত টুকরো টুকরো টুকরো না করে নেস্টেড টুকরাগুলির মায়া তৈরি করা। আমি মূল ক্রিয়াকলাপটি ট্যাবহোস্ট এবং ভিউপাগারটি ব্যবহার করে দুটি ভাইবাল ভিউ পরিচালনা করতে যাঁর দৃশ্যমানতা 0 থেকে 1 এর মধ্যে লেআউট_ ওয়েট টগলিং দ্বারা পরিচালিত হয় manage

//Hide the fragment used by TabHost by setting height and weight to 0
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0);
mTabHostedView.setLayoutParams(lp);
//Show the fragment used by ViewPager by setting height to 0 but weight to 1
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1);
mPagedView.setLayoutParams(lp);

আমি ম্যানুয়ালি প্রাসঙ্গিক লেআউট ওজন পরিচালনা করি ততক্ষণ এটি কার্যকরভাবে আমার জাল "নেস্টেড ফ্রেগমেন্ট" কে একটি স্বতন্ত্র দৃষ্টিভঙ্গি হিসাবে পরিচালনা করতে অনুমতি দেয়।

এখানে আমার ক্রিয়াকলাপ_মাইন.এক্সএমএল:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ringofblades.stackoverflow.app.MainActivity">

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <FrameLayout android:id="@android:id/tabcontent"
                android:background="@drawable/background_image"
                android:layout_width="match_parent"
                android:layout_weight="0.5"
                android:layout_height="0dp"/>
            <android.support.v4.view.ViewPager
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/pager"
                android:background="@drawable/background_image"
                android:layout_width="match_parent"
                android:layout_weight="0.5"
                android:layout_height="0dp"
                tools:context="com.ringofblades.stackoverflow.app.MainActivity">
                <FrameLayout
                    android:id="@+id/container"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />
            </android.support.v4.view.ViewPager>
            <TabWidget android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </TabHost>

    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.ringofblades.stackoverflow.app.NavigationDrawerFragment"
        tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>

নোট করুন যে "@ + আইডি / পেজার" এবং "@ + আইডি / ধারক" 'অ্যান্ড্রয়েড: লেআউট_ ওয়েট = "0.5" "এবং' অ্যান্ড্রয়েড: বিন্যাস_ উচ্চতা =" 0 ডিপি "'সহ ভাইবোন। এটি এমন যে আমি কোনও স্ক্রিন আকারের জন্য এটি পূর্বরূপে দেখতে পারি। রানটাইম চলাকালীন সময়ে যাইহোক, তাদের ওজনগুলি কোডে ম্যানিপুলেটেড হবে।


হাই, আমি কৌতুহল যে আপনি কেন ট্যাবগুলির সাথে অ্যাকশনবারের পরিবর্তে ট্যাবহস্ট ব্যবহার করতে বেছে নিয়েছেন? আমি নিজেই ট্যাবহোস্ট থেকে সবেমাত্র অ্যাকশনবারে চলে এসেছি এবং আমার কোডটি আরও পরিষ্কার এবং আরও কমপ্যাক্ট হয়ে গেছে ...
ইগোরগানপলস্কি

যতদূর আমি মনে করি, অ্যাকশনবারের ট্যাবগুলি ব্যবহার করার একটি অসুবিধা হ'ল এটি একটি স্পিনার স্প্রিন-ডাউন মেনু হিসাবে দেখানোর জন্য স্বয়ংক্রিয়ভাবে সিদ্ধান্ত নেয় (ছোট পর্দার ক্ষেত্রে) এবং এটি আমার পক্ষে ভাল ছিল না। তবে আমি ১০০% নিশ্চিত নই।
উইন্ডারাইডার

@ ইগোর, আমি এখানে কোথাও পড়েছি SOযে একটিতে ActionBarট্যাব ব্যবহার করা Navigation Drawerভাল নয় কারণ এটি স্বয়ংক্রিয়ভাবে আপনার ড্রয়ারের দৃষ্টিতে ট্যাবগুলি স্থাপন করবে। দুঃখিত, এটি ব্যাক আপ করার লিঙ্ক আমার কাছে নেই।
আজুরস্পট

1
@NoniA। blog.xamarin.com/android-tips-hello-toolbar-goodbye-action-bar আপনি কি আদৌ Android এর বিকাশ অনুসরণ করেন?
ইগোরগানাপলস্কি

1
বাহ, লিঙ্কটি ইগোরের জন্য ধন্যবাদ! আমি নিশ্চিত এটি পরীক্ষা করে দেখতে হবে। আমি এখনও একটি শিক্ষানবিস, সুতরাং অ্যান্ড্রয়েডের সাথে শিখতে আরও এক মিলিয়ন জিনিস রাখুন, তবে এইটিকে রত্ন বলে মনে হচ্ছে! আবার ধন্যবাদ.
আজুরস্পট

1

@ ক্রিস। জেনকিন্সের জবাবের ভিত্তিতে বিল্ডিং, জীবনচক্রের ইভেন্টগুলিতে বিভাজন (গুলি) অপসারণ করার জন্য এটিই আমার জন্য ভাল কাজ করছে (যা ইলিজালস্টেটএক্সেপশন ফেলে দেওয়ার প্রবণতা রয়েছে)। এটি হ্যান্ডলারের পদ্ধতির এবং একটি ক্রিয়াকলাপের একটি সংমিশ্রণ ব্যবহার করে is আইসফিনিশিং () চেক (অন্যথায় এটি "SaveInstanceState এর পরে এই ক্রিয়াটি সম্পাদন করতে পারে না") এর জন্য একটি ত্রুটি নিক্ষেপ করবে।

import android.app.Activity;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public abstract class BaseFragment extends Fragment {
    private final Handler handler = new Handler();

    /**
     * Removes the {@link Fragment} using {@link #getFragmentManager()}, wrapped in a {@link Handler} to
     * compensate for illegal states.
     *
     * @param fragment The {@link Fragment} to schedule for removal.
     */
    protected void removeFragment(@Nullable final Fragment fragment) {
        if (fragment == null) return;

        final Activity activity = getActivity();
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (activity != null && !activity.isFinishing()) {
                    getFragmentManager().beginTransaction()
                            .remove(fragment)
                            .commitAllowingStateLoss();
                }
            }
        });
    }

    /**
     * Removes each {@link Fragment} using {@link #getFragmentManager()}, wrapped in a {@link Handler} to
     * compensate for illegal states.
     *
     * @param fragments The {@link Fragment}s to schedule for removal.
     */
    protected void removeFragments(final Fragment... fragments) {
        final FragmentManager fragmentManager = getFragmentManager();
        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        for (Fragment fragment : fragments) {
            if (fragment != null) {
                fragmentTransaction.remove(fragment);
            }
        }

        final Activity activity = getActivity();
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (activity != null && !activity.isFinishing()) {
                    fragmentTransaction.commitAllowingStateLoss();
                }
            }
        });
    }
}

ব্যবহার:

class MyFragment extends Fragment {
    @Override
    public void onDestroyView() {
        removeFragments(mFragment1, mFragment2, mFragment3);
        super.onDestroyView();
    }
}

1

যদিও ওপিতে বিশেষ পরিস্থিতি থাকতে পারে যা তাকে সমর্থন লাইব্রেরি ব্যবহার করতে বাধা দেয়, তবে বেশিরভাগ লোকের এটি ব্যবহার করা উচিত। অ্যান্ড্রয়েড ডকুমেন্টেশন এটির প্রস্তাব দেয় এবং এটি আপনার অ্যাপকে আরও বিস্তৃত দর্শকদের জন্য উপলব্ধ করে তুলবে।

ভিতরে আমার পূর্ণাঙ্গ উত্তর এখানে আমি দৃষ্টান্তমূলক সমর্থন লাইব্রেরির সাথে নেস্টেড টুকরা ব্যবহার করতে প্রদর্শক করেছিলাম।

এখানে চিত্র বর্ণনা লিখুন


আমি ওপি ছিলাম। সমর্থন lib ব্যবহার না করার কারণ হ'ল এটি একটি সংস্থার অভ্যন্তরীণ অ্যাপ্লিকেশন, যেখানে ব্যবহৃত হার্ডওয়্যারটি স্পষ্টভাবে> = 4.0 এবং <= 4.1 হিসাবে সংজ্ঞায়িত করা হয়েছিল। বিস্তৃত দর্শকের কাছে পৌঁছানোর দরকার ছিল না, এটি ছিল অভ্যন্তরীণ কর্মী এবং অ্যাপটির ব্যবহারকারীর বাইরে ব্যবহার করার কোনও উদ্দেশ্য ছিল না। সমর্থন lib এর একমাত্র কারণ পশ্চাদপটে সামঞ্জস্যপূর্ণ হতে পারে - তবে একটি আশা করবে যে সমর্থন লাইব্রেরির সাথে আপনি যা কিছু করতে পারেন, আপনি এটি ছাড়া "নেটিভালি" অর্জন করতে সক্ষম হবেন। কোনও "নেটিভ" উচ্চতর সংস্করণটিতে সমর্থন লাইব্রেরির চেয়ে কম বৈশিষ্ট্য থাকতে পারে যা কেবলমাত্র নিম্নমুখী-সামঞ্জস্যপূর্ণ।
ম্যাথিয়াস কনরাডেট

1
তবুও আপনি সমর্থন লাইব্রেরিটি ব্যবহার করতে পারেন এবং আমিও এটি করতে পারি। গুগল কেন সমর্থন লাইব্রেরিতে কেবল বৈশিষ্ট্যগুলি সরবরাহ করে তবে বাইরে নয়, বা কেন তারা এটিকে সমর্থন লাইব্রেরি হিসাবে ডাকবে এবং কেন এটি সর্বোত্তম অনুশীলন তা যদি তখনকার সামগ্রিক মান হিসাবে তৈরি করে না, কেবল তা বুঝতে পারি নি। সমর্থন লাইব্রেরি সম্পর্কে এখানে একটি ভাল নিবন্ধ: মার্টিয়ানক্রাফট
ম্যাথিয়াস

@ ম্যাথিয়াস, চমৎকার নিবন্ধ।
সুরগাচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.