টুকরা ব্যবহার করার সময় অ্যান্ড্রয়েড নেভিগেশন ড্রয়ার চিত্র এবং আপ ক্যারেটের মধ্যে স্যুইচ করা


177

ন্যাভিগেশন ড্রয়ারটি ব্যবহার করার সময় অ্যান্ড্রয়েড ডেভেলস সুপারিশ করছে যে অ্যাকশনবারে "ন্যাভিগেশন ড্রয়ারে প্রতিনিধিত্ব করা কেবলমাত্র সেই স্ক্রিনগুলিতেই আসলে নেভিগেশন ড্রয়ারের চিত্র থাকা উচিত" এবং "অন্যান্য সমস্ত স্ক্রিনের theতিহ্যবাহী আপ ক্যারেট থাকা উচিত।"

বিশদ জন্য এখানে দেখুন: http://youtu.be/F5COhlbpIbY

আমি একাধিক স্তরের টুকরোগুলি নিয়ন্ত্রণ করতে একটি ক্রিয়াকলাপ ব্যবহার করছি এবং নেভিগেশন ড্রয়ার চিত্রটি সমস্ত স্তরে প্রদর্শিত ও কার্য করতে পেতে পারি।

নিম্ন স্তরের খণ্ডগুলি তৈরি ActionBarDrawerToggle setDrawerIndicatorEnabled(false)করার সময় নেভিগেশন ড্রয়ারের চিত্রটি লুকানোর জন্য আমি কল করতে পারি এবং আপ ক্যারেটটি প্রদর্শিত করতে পারি

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout, 
lowFrag, "lowerFrag").addToBackStack(null).commit();

মূল নেভিগেশন ড্রয়ারের চিত্রের পরিবর্তে উপরের ক্যারেটটি এখনও উপরে স্তরের টুকরাগুলিতে নেভিগেট করার সময় আমার সমস্যা হচ্ছে। নেভিগেশন ড্রয়ারের চিত্রটি পুনরায় প্রদর্শনের জন্য শীর্ষ স্তরের টুকরোগুলিতে অ্যাকশনবারকে কীভাবে "রিফ্রেশ" করবেন সে সম্পর্কে কোনও পরামর্শ?


সমাধান

টমের পরামর্শ আমার পক্ষে কাজ করেছিল। আমি যা করেছি তা এখানে:

যথোপযুক্ত সৃষ্টিকর্তা

এই ক্রিয়াকলাপটি অ্যাপ্লিকেশানের সমস্ত অংশকে নিয়ন্ত্রণ করে।

অন্যদের প্রতিস্থাপনের জন্য নতুন টুকরো তৈরি করার সময়, আমি ড্রয়ারটগলটি এটির setDrawerIndicatorEnabled(false)মতো সেট করে রেখেছি :

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,   
lowFrag).addToBackStack(null).commit();

এরপরে, একটি ওভাররাইডে onBackPressedআমি ড্রয়ারটগলটিকে setDrawerIndicatorEnabled(true)পছন্দ করতে সেট করে উপরেটি উল্টিয়েছি :

@Override
public void onBackPressed() {
    super.onBackPressed();
    // turn on the Navigation Drawer image; 
    // this is called in the LowerLevelFragments
    setDrawerIndicatorEnabled(true)
}

লোয়ার লেভেল ফ্রেমে

খণ্ডগুলিতে আমি সংশোধন করেছি onCreateএবং এটি onOptionsItemSelectedপছন্দ করেছি:

ইন onCreateযোগ setHasOptionsMenu(true)অপশন মেনু কনফিগার সক্রিয়। অ্যাকশনবারে <setDisplayHomeAsUpEnabled(true) সক্ষম করতেও সেট করুন :

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // needed to indicate that the fragment would 
    // like to add items to the Options Menu        
    setHasOptionsMenu(true);    
    // update the actionbar to show the up carat/affordance 
    getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}

তারপরে onOptionsItemSelectedযখনই < টিপানো onBackPressed()হয় তখন ক্রিয়াকলাপ থেকে ক্রমবর্ধমান স্তরের এক স্তর উপরে যেতে এবং নেভিগেশন ড্রয়ারের চিত্রটি প্রদর্শিত করতে কল করে :

@Override
public boolean onOptionsItemSelected(MenuItem item) {   
    // Get item selected and deal with it
    switch (item.getItemId()) {
        case android.R.id.home:
            //called when the up affordance/carat in actionbar is pressed
            getActivity().onBackPressed();
            return true;
         
    }

2
এছাড়াও আপনার অনব্যাকপ্রেসড () পদ্ধতিতে আপনি গেটফ্রেগমেন্টম্যানেজার ()। GetBackStackEntryCount () পদ্ধতিতে কতগুলি এন্ট্রি ব্যাক স্ট্যাকের মধ্যে রয়েছে তা যাচাই করতে পারেন এবং ফলাফল মাত্র 0. যদি ড্রয়ার সূচক সক্ষম করে থাকেন তবে সেক্ষেত্রে প্রতিটি লোয়ারলাইভ্রামাগুলিতে হোমঅ্যাসআপ ইন্ডিকেটর সক্ষম করা অপ্রয়োজনীয়।
pvshnik

2
এটি খুব দরকারী! আপনার নিজের পোস্টের "সমাধান" অংশটি সরানো উচিত এবং এটিকে একটি আসল "উত্তর" করা উচিত। আপনি upvotes জন্য আরো পয়েন্ট পাবেন এবং এটি হল সব পরে একটি উত্তর
Oleksiy

কেন তুমি টুকরা এখানে প্রতিস্থাপন করা হয়: .replace(R.id.frag_layout। এটি যদি আরও একটি শ্রেণিবিন্যাস স্তর হয় তবে আমি আশা করব যে আপনি .addএটি পিছনের দিকে চলে যাবেন।
জেজেডি

5
ভাই, আপনি খণ্ডটির theDrawerToggle.setDrawerIndicatorEnabled(false);অভ্যন্তরটি কীভাবে উল্লেখ করবেন ? আমি মনে করি এটি প্রধান ক্রিয়াকলাপ শ্রেণিতে ফাইল হিসাবে ঘোষিত হয়েছে। আমি এটি উল্লেখ করার উপায় খুঁজে পাচ্ছি না। কোন ইঙ্গিত?
স্কাইনেট

1
কোনও সরঞ্জামদণ্ড ব্যবহার করার সময় আমাকে ততক্ষণে ঘরটি ব্যবহার না করার জন্য ডিসপ্লে বিকল্পগুলি স্যুইচ করতে হয়েছিল। অন্যথায় (অভ্যন্তরীণ android.support.v7.intern.widget প্যাকেজের মধ্যে) setDisplayOptions()পদ্ধতিটি ToolbarWidgetWrapperএকই অংশে দ্বিতীয়বার প্রবেশ করার সময় আইকনটি পুনরায় তৈরি করবে না। অন্যরাও যখন এই সমস্যার জন্য হোঁচট খায় কেবল তখনই এখানে রেখে দেওয়া।
ওল্ফ্রাম রিটমিয়ার

উত্তর:


29

আপনি লিখেছেন যে, নিম্ন-স্তরের টুকরোগুলি বাস্তবায়নের জন্য আপনি নিম্ন স্তরের খণ্ডকে নতুন ক্রিয়াকলাপে প্রয়োগের বিপরীতে বিদ্যমান খণ্ডগুলি প্রতিস্থাপন করছেন।

আমি মনে করি আপনাকে তখন ব্যাক কার্যকারিতাটি ম্যানুয়ালি প্রয়োগ করতে হবে: যখন ব্যবহারকারী পিছনে চাপলে আপনার কোড থাকে যা স্ট্যাকটি পপ করে (যেমন Activity::onBackPressedওভাররাইডে)। সুতরাং, আপনি যেখানেই এটি করেন না কেন, আপনি এটির বিপরীত করতে পারেন setDrawerIndicatorEnabled


ধন্যবাদ টম, যে কাজ! আমি যে সমাধানটি ব্যবহার করেছি তার সাথে আমি আসল পোস্টটি আপডেট করেছি।
ইভিলআশ

6
নিম্ন স্তরের খণ্ডে কীভাবে ডেড্রেটারটগলটি উল্লেখ করা যায়? এটি মূল ক্রিয়াকলাপে সংজ্ঞায়িত করা হয়েছে, এটি প্রায় আমার মাথা পেতে পারে না!
স্কাইনেট

1
আপনি খণ্ডটি থেকে ক্রিয়াকলাপটি পেতে পারেন। সুতরাং ড্রয়ার টগল অ্যাক্সেস করতে আপনার মূল ক্রিয়াকলাপে কেবল একজন গিটার যুক্ত করুন।
রাফেল রয়ের-রিভার্ড

83

এটি 1-2-2 হিসাবে সহজ।

আপনি যদি অর্জন করতে চান:

1) ড্রয়ার সূচক - যখন কোনও টুকরো পিছনের স্ট্যাকের মধ্যে নেই বা ড্রয়ারটি খোলা নেই

2) তীর - যখন কিছু খণ্ড পিছনের স্ট্যাকের হয়

private FragmentManager.OnBackStackChangedListener
        mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
        syncActionBarArrowState();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mDrawerToggle = new ActionBarDrawerToggle(
            this,             
            mDrawerLayout,  
            R.drawable.ic_navigation_drawer, 
            0, 
            0  
    ) {

        public void onDrawerClosed(View view) {
            syncActionBarArrowState();
        }

        public void onDrawerOpened(View drawerView) {
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
}

@Override
protected void onDestroy() {
    getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
    super.onDestroy();
}

private void syncActionBarArrowState() {
    int backStackEntryCount = 
        getSupportFragmentManager().getBackStackEntryCount();
    mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}

3) উভয় সূচক তাদের আকৃতি অনুযায়ী কাজ করতে

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.isDrawerIndicatorEnabled() && 
        mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    } else if (item.getItemId() == android.R.id.home && 
               getSupportFragmentManager().popBackStackImmediate()) {
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}

পিএস 3-লাইনের সূচক আচরণ সম্পর্কিত অন্যান্য টিপসে অ্যান্ড্রয়েড বিকাশকারীদের উপর নেভিগেশন ড্রয়ার তৈরি করা দেখুন ।


3
আমি আপনার অনুরূপ কিছু শেষ। আমি মনে করি এই সমাধানটি (যা দেখানো হয়েছে তার মধ্যে ফ্লিপ করতে ব্যাকস্ট্যাক চ্যাঞ্জডলিস্টনার ব্যবহার করে) সর্বাধিক মার্জিত। তবে আমার দুটি পরিবর্তন রয়েছে: 1) আমি অনড্রেসারক্লসড / অনড্রেয়ার ওপেন কলগুলিতে ড্রয়ার সূচকটি কল / পরিবর্তন করি না - এটি প্রয়োজন হয় না, এবং 2) আমি খণ্ডগুলি নিজেই আপস নেভিগেশনটিকে পরিচালনা করতে পারি যেগুলি সমস্ত উত্তরাধিকার সূত্রে প্রাপ্ত হয় অপশনস আইটেমসিলিগ্রেটেড (..) এ প্রয়োগ করে এবং যা সর্বদা সেটহ্যাসঅপশনস মেনু (সত্য) বলে;
এস্পেন রিসকেডাল

2
Yout এছাড়াও তীর মোডে নেভিগেশন ড্রয়ারের জন্য সোয়াইপ অঙ্গভঙ্গিটি লক করা উচিত: mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED); এবং এটি আবার ড্রয়ার সূচক মোডে সক্ষম করুন
আর্টকোনিগ

5
আমি আমার নেভিগেশনড্রویر খণ্ডে এগুলি করে শেষ করেছি। ধন্যবাদ, কমন বিটিডব্লিউর মতো কাজ করে।
হিমশীতল

1
setActionBarArrowDependingOnFragmentsBackStack()... কী দীর্ঘ নাম: P
S.Thiongane

2
আমি খণ্ড A থেকে বি তে গিয়ে ব্যাকস্ট্যাক এ এ যুক্ত করলে এটি আমার পক্ষে আপ বোতামটি দেখায় না। :(
এন্ডিস

14

আমি পরবর্তী জিনিস ব্যবহার করেছি:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                if(getSupportFragmentManager().getBackStackEntryCount() > 0){
                    mDrawerToggle.setDrawerIndicatorEnabled(false);
                    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                }
                else {
                    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                    mDrawerToggle.setDrawerIndicatorEnabled(true);
                }
            }
        });

1
আপনাকে অনেক ধন্যবাদ, এটিই কেবল বাস্তবে কাজ করেছিল। আমি এটি যুক্ত করার পরে, drawerToggle.setToolbarNavigationClickListener(এই শ্রোতার তীরটি ক্লিক করার সময় ডাকা হবে
এপিকপান্ডাফোরস

ইউরি আপনাকে ধন্যবাদ, এটি আমার সমস্যা সমাধানে আমাকে সহায়তা করেছে
মুহাম্মদ শোয়েব মুর্তজা

12

যদি আপনার আপ অ্যাকশন বার বোতামটি কাজ না করে তবে শ্রোতাদের যুক্ত করতে ভুলবেন না:

// Navigation back icon listener
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
});

হোম বোতামের সাহায্যে একটি ড্রয়ারের নেভিগেশন বাস্তবায়নে আমার কিছুটা সমস্যা হয়েছে, অ্যাকশন বাটন বাদে সবকিছুই কাজ করেছে।


10

ড্রয়ারটগলের স্থিতির উপর নির্ভর করে মেইনএকটিভিটিতে হোম আইটেম নির্বাচন পরিচালনা করার চেষ্টা করুন। এইভাবে আপনাকে প্রতিটি খণ্ডে একই কোড যুক্ত করতে হবে না।

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Only handle with DrawerToggle if the drawer indicator is enabled.
    if (mDrawerToggle.isDrawerIndicatorEnabled() &&
            mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action buttons
    switch (item.getItemId()) {
        // Handle home button in non-drawer mode
        case android.R.id.home:
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

+1 ঝরঝরে সমাধান। আপনার উত্তর সম্পূর্ণরূপে ব্যবহারযোগ্য হওয়ার জন্য আপনার ব্যাকস্টকে একটি চেক যুক্ত করা উচিত। এটি খালি হয়ে গেলে স্বয়ংক্রিয়ভাবে ড্রয়ার সূচককে সত্যে সেট করুন।
এইচপিটাইম

@ এইচপিটাইম আমি ব্যাকস্ট্যাকটি পরিচালনা করি onBackPressed()কারণ আমি উভয়ের জন্য একই আচরণ চেয়েছিলাম।
dzeikei

6

অনুসরণ করুন

@ ডাজেইকি প্রদত্ত সমাধানটি ঝরঝরে, তবে খণ্ডগুলি ব্যবহার করার সময়, ব্যাকস্ট্যাকটি ফাঁকা থাকলে স্বয়ংক্রিয়ভাবে ড্রয়ার সূচকটি পুনরায় সেট করার জন্য এটি বাড়ানো যেতে পারে।

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Only handle with DrawerToggle if the drawer indicator is enabled.
    if (mDrawerToggle.isDrawerIndicatorEnabled() &&
            mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action buttons
    switch (item.getItemId()) {
        // Handle home button in non-drawer mode
        case android.R.id.home:
            // Use getSupportFragmentManager() to support older devices
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.popBackStack();
            // Make sure transactions are finished before reading backstack count
            fragmentManager.executePendingTransactions();
            if (fragmentManager.getBackStackEntryCount() < 1){
                mDrawerToggle.setDrawerIndicatorEnabled(true);  
            }
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

সম্পাদনা

@ জেজেডি প্রশ্নের জন্য।

খণ্ডগুলি কোনও ক্রিয়াকলাপে রাখা / পরিচালনা করা হয়। উপরের কোড কার্যকলাপ একবার লেখা আছে, কিন্তু শুধুমাত্র জন্য ক্যারেট হ্যান্ডেল onOptionsItemSelected

আমার অ্যাপ্লিকেশনগুলির একটিতে আমার যখন পিছনের বোতামটি টিপছিল তখন আপ ক্যারেটের আচরণ পরিচালনা করতে হবে। ওভাররাইড করে এটি হ্যান্ডেল করা যায় onBackPressed

@Override
public void onBackPressed() {
    // Use getSupportFragmentManager() to support older devices
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.executePendingTransactions();
    if (fragmentManager.getBackStackEntryCount() < 1){
        super.onBackPressed();
    } else {
        fragmentManager.executePendingTransactions();
        fragmentManager.popBackStack();
        fragmentManager.executePendingTransactions();
        if (fragmentManager.getBackStackEntryCount() < 1){
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        }
    }
};

এর মধ্যে কোড সদৃশ নোট করুন onOptionsItemSelectedএবং onBackPressedকোন পদ্ধতি তৈরি করে এবং উভয় স্থানে সেই পদ্ধতিটি কল করে এড়ানো যেতে পারে।

এছাড়াও নোট করুন যে আমি আমার আরও দুটি বার যুক্ত করেছি executePendingTransactionsযা আমার ক্ষেত্রে প্রয়োজন ছিল অথবা অন্যথায় আমার মাঝে মাঝে ক্যারেটের অদ্ভুত আচরণ ছিল।


আপ ক্যারেট আচরণটি বাস্তবায়নের জন্য এটি কি আমার সম্পূর্ণ কোড যুক্ত করা দরকার বা আপনি অন্য পোস্টগুলির মধ্যে একটিতে উল্লেখ করছেন? দয়া করে এটি পরিষ্কার করুন।
জেজেডি

সম্পাদনার জন্য ধন্যবাদ। আসলে আমি mDrawerToggleএকটা NavigationDrawerFragmentক্লাসের মধ্যেই রক্ষণ করি । এটা পেতে আমি হোম বাটন / সূচকটি রাজ্যের টগল এছাড়াও প্রয়োজন কাজ করার জন্য - দেখুন: NavigationDrawerFragment#toggleDrawerIndicator। তদুপরি, আমি নিশ্চিত না যে আপনার প্রাথমিক চেক ইন দরকার onOptionsItemSelected: আমি এটিকে নিঃশর্ত করলাম। - সরল উদাহরণ
জেজেডি

সংশোধিত বাস্তবায়ন : আপনি প্রাথমিক চেক ইন সম্পর্কে ঠিক বলেছেন onOptionsItemSelected। এটি নিশ্চিত করে যে নেভিগেশন ড্রয়ারটি এখনও শীর্ষ-স্তরের শ্রেণিবিন্যাসে খোলে। তবে আমি কোডটি কোডটিতে স্থানান্তরিত করেছি NavigationDrawerFragment#onOptionsItemSelected। এটি আমাকে প্রকাশ mDrawerToggleকরতে না সহায়তা করে MainActivity
জেজেডি

@ জেজেডি আমার মনে হয়েছে যে স্তরক্রমের প্রতিটি স্তরের আপ ক্যারেটের জন্য সবকিছু কাজ করার জন্য কিছুটা লড়াই করার চেষ্টা করেছি। যতক্ষণ না এটি আপনার পক্ষে কাজ করে ঠিক আছে fine অবশ্যই, আপনি যেমনটি বলেছেন, আপনি কোডটি অন্য কোথাও সরিয়ে নিতে পারেন এটি প্রকাশ করতে না।
এইচপিটাইম

2

হ্যামবার্গার মেনুর ভিউ স্থিতি আপডেট করতে আমি হোস্টিং ক্রিয়াকলাপের জন্য একটি ইন্টারফেস তৈরি করেছি। শীর্ষ স্তরের টুকরোগুলির জন্য আমি টগল সেট করেছি trueএবং টুকরোগুলির জন্য আমি আপ করতে চাইছি <তীরটি আমি টগল সেট করেছি false

public class SomeFragment extends Fragment {

    public interface OnFragmentInteractionListener {
        public void showDrawerToggle(boolean showDrawerToggle);
    }

    private OnFragmentInteractionListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            this.mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        mListener.showDrawerToggle(false);
    }
}

তারপরে আমার ক্রিয়াকলাপে ...

public class MainActivity extends Activity implements SomeFragment.OnFragmentInteractionListener {

    private ActionBarDrawerToggle mDrawerToggle;

    public void showDrawerToggle(boolean showDrawerIndicator) {
        mDrawerToggle.setDrawerIndicatorEnabled(showDrawerIndicator);
    }

}

2

এই উত্তরটি কাজ করছে তবে এটির সাথে একটু সমস্যা ছিল। getSupportActionBar().setDisplayHomeAsUpEnabled(false)স্পষ্টভাবে বলা হয় না হয় এবং তা ঘটিয়ে গেল ড্রয়ারের আইকন আড়াল করা এমনকি যখন সেখানে পরিবর্তন তাই backstack কোন আইটেম ছিল setActionBarArrowDependingOnFragmentsBackStack()পদ্ধতি আমার জন্য কাজ করেন।

private void setActionBarArrowDependingOnFragmentsBackStack() {
        int backStackEntryCount = getSupportFragmentManager()
                .getBackStackEntryCount();
        // If there are no items in the back stack
        if (backStackEntryCount == 0) {
            // Please make sure that UP CARAT is Hidden otherwise Drawer icon
            // wont display
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
            // Display the Drawer Icon
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        } else {
            // Show the Up carat
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            // Hide the Drawer Icon
            mDrawerToggle.setDrawerIndicatorEnabled(false);
        }

    }

আমার ক্ষেত্রে দৃth় সমাধানটি কেবল অ্যাকশনবারড্রওয়ারটগল.সেটড্রাওয়ারআইডিফিকেশনএবলড (getSupportFraamentManager ()। getBackStackEntryCount () <0) ব্যবহার করছিল;
গোরেটস

1

যুক্তি পরিষ্কার। টুকরা ব্যাক স্ট্যাকটি পরিষ্কার থাকলে পিছনে বোতামটি দেখান। উপাদান হ্যামবার্গার-ব্যাক অ্যানিমেশন দেখান যদি খণ্ড স্ট্যাকটি পরিষ্কার না হয়।

getSupportFragmentManager().addOnBackStackChangedListener(
    new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            syncActionBarArrowState();
        }
    }
);


private void syncActionBarArrowState() {
    int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
    mNavigationDrawerFragment.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}

//add these in Your NavigationDrawer fragment class

public void setDrawerIndicatorEnabled(boolean flag){
    ActionBar actionBar = getActionBar();
    if (!flag) {
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
        mDrawerToggle.setHomeAsUpIndicator(getColoredArrow());
    } else {
        mDrawerToggle.setDrawerIndicatorEnabled(true);
    }
    mDrawerToggle.syncState();
    getActivity().supportInvalidateOptionsMenu();
}

//download back button from this(https://www.google.com/design/icons/) website and add to your project

private Drawable getColoredArrow() {
    Drawable arrowDrawable = ContextCompat.getDrawable(getActivity(), R.drawable.ic_arrow_back_black_24dp);
    Drawable wrapped = DrawableCompat.wrap(arrowDrawable);

    if (arrowDrawable != null && wrapped != null) {
        // This should avoid tinting all the arrows
        arrowDrawable.mutate();
        DrawableCompat.setTint(wrapped, Color.GRAY);
    }
    return wrapped;
}

1

আপনি যদি জিএমএল অ্যাপ্লিকেশনটি একবার দেখে থাকেন এবং ক্যারেট / সাশ্রয়ী মূল্যের আইকনটি সন্ধান করতে এখানে আসেন ..

আমি আপনাকে এটি করতে বলব, উপরের উত্তরগুলির কোনওটিই পরিষ্কার ছিল না। আমি গৃহীত উত্তরটি পরিবর্তন করতে সক্ষম হয়েছি।

  • নেভিগেশনড্রেয়ার -> তালিকাভিউতে উপ-বিভাগগুলি রয়েছে।


  • সাবফ্রেগমেন্টগুলি এভাবে তালিকাভুক্ত হবে

  • প্রথম ফ্রেমমেন্ট == অবস্থান 0 ---> এতে উপ-বিভাগগুলি -> খণ্ড থাকবে

  • secondFragment
  • তৃতীয় ফ্রেমমেন্ট এবং আরও ...

ফার্স্ট ফ্রেমে আপনার অন্য খণ্ড রয়েছে।

ড্রয়ারএকটিভিটিতে এটি কল করুন

getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getFragmentManager().getBackStackEntryCount() > 0) {
                mDrawerToggle.setDrawerIndicatorEnabled(false);
            } else {
                mDrawerToggle.setDrawerIndicatorEnabled(true);
            }
        }
    });

এবং খণ্ডে

    setHasOptionsMenu(true);    

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Get item selected and deal with it
    switch (item.getItemId()) {
        case android.R.id.home:
            //called when the up affordance/carat in actionbar is pressed
            activity.onBackPressed();
            return true;
    }
    return false;
}

অনব্যাকপ্রেসড ড্রয়ার ক্রিয়াকলাপ পদ্ধতিতে আবার নেভিগেশন তালিকা আইকন সক্ষম করতে ড্রয়ারকে টগলকে সত্যে সেট করে।

ধন্যবাদ, পুস



0

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

@Override
public boolean onSupportNavigateUp() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        // handle up navigation
        return true;
    } else {
        return super.onSupportNavigateUp();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.