android - खंडों का उपयोग करते समय एंड्रॉइड नेविगेशन ड्रॉवर छवि और ऊपर कैरेट के बीच स्विचिंग




android-fragments android-actionbar (8)

आईएमओ, riwnodennyk या टॉम के समाधान में ऑनविगेटअप () (जैसा कि here दिखाया गया here ) का उपयोग क्लीनर है और बेहतर काम करता प्रतीत होता है। इसके साथ ऑनऑप्शन इटैम चयन कोड को बस प्रतिस्थापित करें:

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

नेविगेशन ड्रॉवर का उपयोग करते समय एंड्रॉइड देव सिफारिश कर रहे हैं कि एक्शनबार में "केवल उन स्क्रीनों को जो नेविगेशन ड्रॉवर में दर्शाए जाते हैं, वास्तव में नेविगेशन ड्रॉवर छवि होनी चाहिए" और "अन्य सभी स्क्रीनों में पारंपरिक कैरेट है।"

विवरण के लिए यहां देखें: 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) सेट ड्रावर 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();

इसके बाद, बैकप्रेस किए गए ओवरराइड में, मैंने ड्रॉवर टॉगल को सेट ड्रावर setDrawerIndicatorEnabled(true) सेट करके उपरोक्त को वापस कर दिया:

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

लोअरलेवलफ्रेगमेंट्स में

टुकड़ों में मैंने संशोधित किया onCreate और onOptionsItemSelected इस तरह से चुना गया है:

विकल्प मेनू को कॉन्फ़िगर करने में सक्षम करने के लिए setHasOptionsMenu(true) जोड़ा गया setHasOptionsMenu(true)< Actionbar में < को सक्षम करने के लिए 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;
        … 
    }


ड्रॉवर टॉगल की स्थिति के आधार पर मुख्य वस्तु में होम आइटम चयन को संभालने का प्रयास करें। इस तरह आपको हर टुकड़े में एक ही कोड जोड़ने की ज़रूरत नहीं है।

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

तर्क स्पष्ट है। अगर टुकड़ा वापस ढेर स्पष्ट है तो वापस बटन दिखाएं। अगर टुकड़ा ढेर स्पष्ट नहीं है तो सामग्री हैम्बर्गर-बैक एनीमेशन दिखाएं।

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

मैंने हैमबर्गर मेनू के दृश्य स्थिति को अद्यतन करने के लिए होस्टिंग गतिविधि के लिए एक इंटरफ़ेस बनाया है। शीर्ष स्तर के टुकड़ों के लिए मैंने टॉगल को 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);
    }

}

यदि आप GMAIL ऐप पर नज़र डालते हैं और कैरेट / affordance आइकन खोजने के लिए यहां आते हैं ..

मैं आपको ऐसा करने के लिए कहूंगा, उपर्युक्त उत्तर में से कोई भी स्पष्ट नहीं था। मैं स्वीकृत उत्तर को संशोधित करने में सक्षम था।

  • नेविगेशन ड्रावर -> सूचीदृश्य में सबफैगमेंट्स शामिल हैं।

  • उपखंड इस तरह सूचीबद्ध होंगे

  • फर्स्ट फ्रैगमेंट == स्थिति 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;
}

OnBackPressed दराज गतिविधि विधि पर नेविगेशन सूची आइकन को फिर से सक्षम करने के लिए दराज टॉगल को सही पर सेट करें।

धन्यवाद, पुस्प


यह 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-लाइन सूचक संकेत के बारे में अन्य युक्तियों पर एंड्रॉइड डेवलपर्स पर एक नेविगेशन ड्रॉवर बनाना


यह answer काम कर रहा था लेकिन इसके साथ एक छोटी सी समस्या थी। 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);
        }

    }




navigation-drawer