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




android-fragments android-actionbar (8)

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

@Override
public boolean onSupportNavigateUp() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        // handle up navigation
        return true;
    } else {
        return super.onSupportNavigateUp();
    }
}

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

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

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

নিচের স্তরের টুকরা তৈরি করার সময় আমি 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) সেট সেট্রাউড 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) সেটডওয়্যার সেটিকে সেট করে সেটিকে উপরে setDrawerIndicatorEnabled(true) :

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

LowerLevelFragments মধ্যে

আমি সংশোধিত টুকরা মধ্যে onCreate এবং onOptionsItemSelected onCreate :

ইন setHasOptionsMenu(true) অপশন মেনু কনফিগার করার জন্য সক্ষম। এছাড়াও setDisplayHomeAsUpEnabled(true) সেট করুন < actionbar মধ্যে < সক্রিয় করতে:

@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);
}

তারপরে onBackPressed() এটি যখনই চাপানো হয় তখন এটি নির্বাচন করা হয় এবং এটি onBackPressed() এক স্তরে স্থানান্তরিত করতে এবং ন্যাভিগেশন ড্রয়ারের চিত্রটি প্রদর্শন করে ক্রিয়াকলাপ থেকে 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;
         
    }

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

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

আমি একটি হোম বাটন সঙ্গে ড্রয়ারের পরিভ্রমন বাস্তবায়ন কিছু সমস্যা আছে, কর্ম buton ছাড়া সবকিছু কাজ।


আপনি নিম্ন স্তরের টুকরাগুলি বাস্তবায়ন করতে এটি লিখেছেন, আপনি একটি নতুন ক্রিয়াকলাপের নিম্ন-স্তরের টুকরা বাস্তবায়ন করার বিরোধিতায় বিদ্যমান অংশটি প্রতিস্থাপন করছেন।

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


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

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);
                }
            }
        });

এই answer কাজ ছিল কিন্তু এটি সঙ্গে একটি সামান্য সমস্যা ছিল। getSupportActionBar().setDisplayHomeAsUpEnabled(false) স্পষ্টভাবে বলা হয় নি এবং getSupportActionBar().setDisplayHomeAsUpEnabled(false) আইকনটি লুকিয়ে থাকার কারণে এমনকি ব্যাকস্ট্যাকে কোন আইটেম ছিল না, তাই 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);
        }

    }

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

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

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


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

আমি আপনাকে এই কাজ করতে জিজ্ঞাসা করবে, উপরে কোন উত্তর পরিষ্কার ছিল না। আমি গৃহীত উত্তর সংশোধন করতে সক্ষম হয়েছিলাম।

  • ন্যাভিগেশন ড্রয়ার -> তালিকাতে সাবফ্যাগমেন্ট রয়েছে।

  • subfragments এই মত তালিকাভুক্ত করা হবে

  • firstfragment == অবস্থান 0 ---> এই subfragments থাকবে -> বিভাজক

  • 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;
}

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

ধন্যবাদ, Pusp


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

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;
}






navigation-drawer