2013-01-11 22 views
20

मेरे पास मेरे आवेदन में केवल एक activity और एकाधिक fragments है।व्यक्तिगत खंड के मैन्युअल रूप से वापस बटन दबाकर पिछले खंड पर वापस कैसे जाना है?

दो मुख्य खंड ए (बाएं) और बी (दाएं)।

Fragment A1 called from A 

B1 called from B 

B2 called from B1 

सभी fragments व्यक्ति वापस बटन होते हैं।

तो जब मैं fragmentA1 का बटन वापस दबाते हैं, तो इसे वापस एक, इसी तरह जब वापस बटन से बी 2 दबाया जाता है, बी 1 प्रकट होता है और से बी 1 को बी और के पास जाना चाहिए शीघ्र।

इस प्रकार की कार्यक्षमता को कैसे कार्यान्वित करें?

+0

'सभी टुकड़ों में व्यक्तिगत बैक बटन होते हैं।' जो मुझे बिल्कुल समझ में नहीं आता है। क्या आप इसे और समझा सकते हैं? – Budius

+0

बाएं टुकड़े वाले ए और दाएं खंड बी, मेरे पास ए के पहले बटन दबाते समय ए में 3 बटन हैं, ए 1 प्रदर्शित होता है। मेरे पास ए 1 में सूचीदृश्य है। जब सूचीदृश्य आइटम पर क्लिक करें, तो इसका विवरण दाईं ओर खंड बी 1 पर दिखाई देता है। ए –

उत्तर

0

बैक बटन ऑर्डर में उलटा होगा, जिसमें Fragments added to backstack थे। यह डिफ़ॉल्ट रूप से नेविगेशन फ़ंक्शन के रूप में प्रदान किया जाता है। अब यदि आप विशिष्ट टुकड़े पर जाना चाहते हैं, तो आप बैकस्टैक से show it कर सकते हैं।

4

आप के रूप में समझाया here.

आप popFragments() कॉल कर सकते हैं जब भी आप एक टुकड़ा में वापस बटन क्लिक करें और pushFragments() फोन जब भी आप एक टुकड़ा से दूसरे नेविगेट करने, स्वयं backstack कार्यान्वयन को लागू करने की है।

31
public void onBackPressed() 
{ 
    FragmentManager fm = getActivity().getSupportFragmentManager(); 
    fm.popBackStack(); 
} 
+2

के अन्य 2 बटनों के लिए वही है अगर आयात android.support.v4.app.FragmentManager का उपयोग करते हुए सबसे अच्छा जवाब; –

-1
@Override 
public void onResume() { 

    super.onResume(); 

    getView().setFocusableInTouchMode(true); 
    getView().requestFocus(); 
    getView().setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 

      if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ 

       // replace your fragment here 

       return true; 

      } 

      return false; 
     } 
    }); 
} 

// मुबारक में मदद करता है

19

कोडिंग मैं इसी तरह की स्थिति को लागू किया है अभी।

गतिविधि 'ए' -> एक फ्रैगमेंट 'ए 1' कॉल करता है और मेनू आइटम पर क्लिक करके, यह फ्रैगमेंट 'ए 2' कहता है और यदि उपयोगकर्ता 'ए 2' से वापस बटन दबाता है, तो यह 'ए 1' पर वापस जाता है और यदि उपयोगकर्ता उसके बाद 'ए 1' से वापस दबाता है, तो यह गतिविधि 'ए' को समाप्त करता है और वापस चला जाता है।

देखें निम्नलिखित कोड:

गतिविधि 'ए' - OnCreate() विधि:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activityA); 

    if (savedInstanceState == null) { 
     Fragment fragInstance; 

     //Calling the Fragment newInstance Static method 
     fragInstance = FragmentA1.newInstance(); 

     getFragmentManager().beginTransaction() 
       .add(R.id.container, fragInstance) 
       .commit(); 
    } 
} 

टुकड़ा: 'ए 1'

मैं जगह हूँ नए टुकड़े के साथ मौजूदा खंड जब मेनू आइटम क्लिक कार्रवाई होती है:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.action_edit_columns) { 
     //Open the Fragment A2 and add this to backstack 
     Fragment fragment = FragmentA2.newInstance(); 
     this.getFragmentManager().beginTransaction() 
       .replace(R.id.container, fragment) 
       .addToBackStack(null) 
       .commit(); 

     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

गतिविधि 'ए' - onBackPressed() विधि:

के बाद से सभी टुकड़े एक माता पिता गतिविधि (जो 'ए' है), onBackPressed() विधि आप पॉप की सुविधा देता है टुकड़े अगर कोई हैं या बस पिछली गतिविधि पर वापस आते हैं।

@Override 
public void onBackPressed() { 
    if(getFragmentManager().getBackStackEntryCount() == 0) { 
     super.onBackPressed(); 
    } 
    else { 
     getFragmentManager().popBackStack(); 
    } 
} 

आप देख रहे हैं टुकड़े टुकड़े अंदर एम्बेड करने के लिए, लिंक देखें: http://developer.android.com/about/versions/android-4.2.html#NestedFragments

+1

मुझे लगता है कि यह सबसे अच्छा जवाब है, क्योंकि आप वास्तव में पहले अपने "addToBackStack" को भूलना नहीं चाहते हैं। अन्यथा, पीछे के लिए पॉप करने के लिए कुछ भी नहीं है! – Myoch

+0

हाँ .. किसी ने 'addToBackStack' विधि का उल्लेख नहीं किया। धन्यवाद – h8pathak

1

मेरे लिए यह प्रयास करें, अपने काम।

public void onBackPressed() { 
    if (mainLayout.isMenuShown()) { 
     mainLayout.toggleMenu(); 
    } else { 
     FragmentManager fm = getSupportFragmentManager(); 
     Log.print("back stack entry", fm.getBackStackEntryCount() + ""); 

     if (fm.getBackStackEntryCount() > 1) { 
      fm.popBackStack(); 
      // super.onBackPressed(); 
      // return; 
     } else { 
      if (doubleBackToExitPressedOnce) { 
       fm.popBackStack(); 
       super.onBackPressed(); 
       return; 
      } 

      this.doubleBackToExitPressedOnce = true; 
      Toast.makeText(this, "Press one more time to exit", 
        Toast.LENGTH_SHORT).show(); 

      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 

        doubleBackToExitPressedOnce = false; 
       } 
      }, 3000); 

     } 
    } 
} 
4

बस

getActivity().getFragmentManager().popBackStack(); 
8

करें @ trueblue का जवाब मुझे एक मामूली लेकिन कष्टप्रद मुद्दे के साथ जा रहा हो गया। जब बैकस्टैक पर केवल एक टुकड़ा होता है और आप वापस बटन दबाते हैं, तो वह फ्रेम हटा दिया जाता है और ऐप एक खाली स्क्रीन के साथ सक्रिय रहता है। ऐप से बाहर निकलने के लिए उपयोगकर्ता को एक बार फिर बटन दबाए जाने की आवश्यकता होती है। मैं इस स्थिति

@Override 
public void onBackPressed() { 
    if(getFragmentManager().getBackStackEntryCount() == 0) { 
     super.onBackPressed(); 
    } 
    else if(getFragmentManager().getBackStackEntryCount() == 1) { 
     moveTaskToBack(false); 
    } 
    else { 
     getFragmentManager().popBackStack(); 
    } 
} 

को संभालने के लिए जब backstack में केवल 1 टुकड़ा, हम मूल रूप से वापस करने के लिए पूरे एप्लिकेशन को स्थानांतरित करने के एंड्रॉयड कह रहे हैं वहाँ के बाद करने के लिए मूल कोड को संशोधित किया।

अद्यतन (और शायद एक बेहतर जवाब)

तो यह चारों ओर कुछ और पढ़ने करने के बाद, मुझे पता चला आप add fragment manager transactions to back stack कर सकते हैं और फिर एंड्रॉयड स्वचालित रूप से और एक वांछित रास्ते में प्रेस वापस संभालती है कि। नीचे दिए कोड स्निपेट कैसे अंतिम पंक्ति है कि कैसे आप ढेर वापस करने के लिए एक सौदे को जोड़ने से पता चलता

Fragment fragment; //Create and instance of your fragment class here 
FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null); 
fragmentTransaction.commit(); 
fragmentTransaction.addToBackStack(null); 

ऐसा करने के लिए पता चलता है। यह किसी को छोड़कर अधिकांश स्थितियों में टुकड़ों के लिए प्रेस समस्या हल करता है। यदि आप बैक बटन दबाते हैं, तो अंततः आप उस बिंदु तक पहुंच जाएंगे जब बैक स्टैक में केवल एक टुकड़ा होता है। इस बिंदु पर, आपको दो बातें

  1. में से एक करने के लिए गतिविधि जिसमें गतिविधि चल रहा है काम के पीछे ढेर से टुकड़ा आवास निकालें चाहते है। ऐसा इसलिए है क्योंकि आप रिक्त गतिविधि
  2. के साथ समाप्त नहीं करना चाहते हैं यदि गतिविधि कार्य के पीछे के ढेर में एकमात्र गतिविधि है, तो कार्य को पृष्ठभूमि में दबाएं।

मेरे मामले में, यह बाद में था, इसलिए मैं अपने पिछले जवाब से अधिरोहित onBackPressed विधि संशोधित तरह

@Override 
public void onBackPressed() { 
    if(getFragmentManager().getBackStackEntryCount() == 1) { 
     moveTaskToBack(false); 
    } 
    else { 
     super.onBackPressed(); 
    } 
} 

नीचे इस कोड को सरल है, क्योंकि यह कम तर्क है देखने के लिए और यह पर निर्भर करता है हमारे कस्टम कोड की तुलना में ढांचा। दुर्भाग्य से मैंने पहली स्थिति के लिए कोड को लागू करने का प्रबंधन नहीं किया क्योंकि मुझे इसकी आवश्यकता नहीं थी।

+0

इसे बहुत अधिक वोट चाहिए! मेरे लिए बहुत अच्छा काम करता है। धन्यवाद ! –

+0

मुझे java.lang.IllegalStateException मिला: addToBackStack() को प्रतिबद्ध() के बाद बुलाया जाता है जब मैंने addToBackStack (null) को प्रतिबद्ध() के बाद बुलाया; इस मुद्दे को ठीक करने से पहले इसे स्थानांतरित करना – ymerdrengene

-1

यदि आप छवि वापस प्रेस आप इस

private void Backpresses() { 
    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit(); 
} 

तो आप इस तरह कॉल करने के लिए जब आप वापस छवि दबाते हैं जैसे पहली विधि बनाने के लिए ..

back.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Backpresses(); 

       } 
      }); 

यह मेरे लिए अच्छा काम ।

संबंधित मुद्दे