2014-09-25 14 views
8

मुझे बैक स्टैक में खंड लेनदेन जोड़ने में कोई समस्या है। मैं एक मुख्य गतिविधि जिसमें मैं एक मेनू टुकड़ा के साथ अपने लेआउट को पॉप्युलेट है:वापस दबाकर पिछले खंड पर वापस नहीं आता

public class MainActivity extends ActionBarActivity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getFragmentManager().beginTransaction().add(R.id.frag_container, new MainMenuFragment()).commit(); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

फिर, MainMenuFragment अंदर, उपयोगकर्ता जो कुछ अन्य टुकड़ा के साथ मेनू टुकड़ा जगह में परिणाम कुछ विकल्प चुनता है :

public class MainMenuFragment extends Fragment implements OnItemClickListener{ 
    GridView grid; 
    FragmentManager manager; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.main_menu_fragment, container, false); 

    manager = getActivity().getFragmentManager(); 
    grid = (GridView) root.findViewById(R.id.gridView1); 

    grid.setAdapter(new MenuTileAdapter(getActivity())); 
    grid.setOnItemClickListener(this); 

    return root; 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    FragmentTransaction trans = manager.beginTransaction(); 
    if (position == 0){ 
     trans.replace(R.id.frag_container, new BasicSettingsFragment()); 
     trans.addToBackStack(null); 
     trans.commit(); 
    } 
} 

}

मैं क्या समझ के लिए, यह यह करना चाहिए, ताकि जब उपयोगकर्ता अपने डिवाइस पर बटन वापस दबाता है, वे ख हो जाएगा मेनू खंड पर वापस रोका, लेकिन इसके बजाय यह ऐप छोड़ देता है। मैं क्या गलत कर रहा हूं?

+0

कोशिश जोड़ते समय आपकी गतिविधि पर इस एक कोशिश कर सकते हैं trans.add को बदलने की बजाय (R.id.frag_container, new BasicSettingsFragment()); –

+0

इसके अलावा, मैंने स्क्रीन को घूर्णन करते समय देखा कि मेनू खंड को हटाया नहीं गया था, बस छिपा हुआ था। जब मैंने अपने फोन को घुमाया, तो यह 'बेसिकसेटिंगफ्रैगमेंट' पर दिखाई दिया। @ जॉर्जियंसनेटेटोस ने केवल पिछले खंड के शीर्ष पर नया टुकड़ा डाला। – jammaster

+0

आपको पूर्ण मेनमेनूफ्रैगमेंट कोड पोस्ट करना चाहिए, सब ठीक दिखता है। –

उत्तर

2

आपका कोड एक मिश्रण है, आप एक्शनबैर एक्टिविटी का उपयोग एपकोम्पेट से करते हैं और getSupportFragmentManager() का उपयोग नहीं करते हैं और यदि आप इसका उपयोग करने का निर्णय लेते हैं तो टुकड़े आयात एक एपकोम्पेट होना चाहिए। यदि नहीं, तो FragmentManager

साथ ActionBarActivity के बजाय गतिविधि और सरल टुकड़ा आयात का उपयोग

अपनी गतिविधि android:configChanges="keyboardHidden|orientation|screenSize" यह करने के लिए इस जोड़े को पुन: प्रारंभ जब आप बारी बारी से अपनी गतिविधि बंद हो जाएगा। टुकड़े पर setRetainInstance(true) का उपयोग करें।

+0

टिप्पणियां पढ़ें, मैंने उस भाग को हल किया। –

+0

आपको शायद ओपी को एक नया प्रश्न पोस्ट करने के लिए प्रोत्साहित करना चाहिए। –

0

जब आप जोड़ सकते हैं या FragmentManager साथ एक टुकड़ा की जगह, आप मैन्युअल commit() कॉल करने से पहले addToBackStack() साथ backstack करने के लिए पुराने टुकड़ा जोड़ने की जरूरत है।

+0

यही वह है जो मैं कर रहा हूं। समस्या यह है कि जब मैं 'प्रतिस्थापन' का उपयोग करता हूं, तो यह पुराने खंड को नहीं हटाता है, क्योंकि जब मैं स्क्रीन को घुमाता हूं, तो यह घूर्णन से पहले क्या था वहां शीर्ष पर दिखाई देता है। – jammaster

1

आप बैक स्टैक में मेनमेनूफ्रैगमेंट नहीं जोड़ रहे हैं। अपने गतिविधि में अधिलेखित

getFragmentManager().beginTransaction().add(
R.id.frag_container, new MainMenuFragment()). 
addToBackStack(null).commit(); 
5

:

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

और शायद आप हर प्रतिबद्ध टुकड़ा लेनदेन में उपयोग करने की आवश्यकता:

FragmentTransaction.addToBackStack(null); 
संबंधित मुद्दे