8

मैं कई टुकड़े के साथ एक गतिविधि को चालू किया है। मैं अपने टैब के लिए actionbarSherlock का भी उपयोग कर रहा हूं जो टुकड़ों से भी जुड़ा हुआ है।वर्तमान टुकड़ा हो जाओ और onSaveInstanceState() विधि पर सहेजें स्क्रीन अभिविन्यास

मेरी समस्या यह है कि जब मैं स्क्रीन को घुमाने के लिए जा रहा हूं (जो लैंडस्केप/इसके विपरीत चित्र है), तो मेरी गतिविधि को फिर से कॉल किया जाएगा ताकि यह मेरी गतिविधि को पुनरारंभ कर सके।

मैं अपने गतिविधि पुन: प्रारंभ नहीं लेकिन सिर्फ वर्तमान टुकड़ा है कि इससे पहले कि यह घुमाने था दिखाया गया था बहाल करना चाहते हैं। कृपया android:configChanges="orientation|keyboardHidden" का उत्तर न दें क्योंकि इससे समस्या हल नहीं होती है बल्कि इसकी एक साधारण हैक की तरह। मेरा समाधान ऑनसेव इंस्टेंसस्टेट और ऑनस्टोर इंस्टेंसस्टेट विधियों पर था, लेकिन मुझे नहीं पता कि मेरी समस्या के साथ इसका उपयोग कैसे किया जाए। कृपया इस के साथ मेरी मदद करें। किसी भी प्रतिक्रिया की अत्यधिक सराहना की जाती है।

कोड:

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    ActionBar.Tab tabA = actionBar.newTab().setIcon(R.drawable.about); 
    ActionBar.Tab tabE = actionBar.newTab().setIcon(R.drawable.faq); 
    ActionBar.Tab tabB = actionBar.newTab().setIcon(R.drawable.sponsors); 
    ActionBar.Tab tabC = actionBar.newTab().setIcon(R.drawable.map); 
    ActionBar.Tab tabD = actionBar.newTab().setIcon(R.drawable.destination); 
    Fragment aboutTab = new PhotosActivity(); 
    Fragment sponsorTab = new SongsActivity(); 
    Fragment mapTab = new HCCMapActivity(); 
    Fragment questTab = new FaqActivity(); 
    Fragment DestinationTab = new TourActivity(); 
    tabA.setTabListener(new MyTabsListener(aboutTab)); 
    tabB.setTabListener(new MyTabsListener(sponsorTab)); 
    tabC.setTabListener(new MyTabsListener(mapTab)); 
    tabD.setTabListener(new MyTabsListener(DestinationTab)); 
    tabE.setTabListener(new MyTabsListener(questTab)); 
    actionBar.addTab(tabD, 0, true); 
    actionBar.addTab(tabC, 1, false); 
    actionBar.addTab(tabA, 2, false); 
    actionBar.addTab(tabB, 3, false); 
    actionBar.addTab(tabE, 4, false); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    // Save UI state changes to the savedInstanceState. 
    // This bundle will be passed to onCreate if the process is 
    // killed and restarted. 
    savedInstanceState.putString("MyString", "Welcome back to Android"); 
    //savedInstanceState.putString("id",) 
    // etc. 
    //getSupportFragmentManager().putFragment(savedInstanceState, "fragment", getSupportFragmentManager().findFragmentById(R.id.fragment_place)); 
} 


@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    FragmentManager fragmentManager ; 
    FragmentTransaction ft ; 
    super.onRestoreInstanceState(savedInstanceState); 
    // Restore UI state from the savedInstanceState. 
    // This bundle has also been passed to onCreate. 
    String myString = savedInstanceState.getString("MyString"); 
    Log.i("Hello", myString); 

    fragmentManager = getSupportFragmentManager(); 
    ft = fragmentManager.beginTransaction(); 
    ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); 
    ft.replace(R.id.fragment_place, getSupportFragmentManager().getFragment(savedInstanceState, "fragment"), null); 
} 

@Override 
public void onConfigurationChanged (Configuration newConfig){ 
    Log.i("hello", "Config"); 
    super.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onPrepareOptionsMenu (Menu menu) { 
    //MenuItem menuitem1 = menu.findItem(R.id.menuitem1); 
    //menuitem1.setVisible(false); 

    menu.getItem(1).setVisible(false); 
    menu.getItem(0).setVisible(false); 
    return true; 
} 


protected class MyTabsListener implements TabListener{ 

    Fragment fragment; 

    public MyTabsListener(Fragment fragment){ 

     this.fragment = fragment; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) {   
     if (myTabPosition < 0){ 
      //ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); 
     }else{ 
      if (myTabPosition > tab.getPosition()){ 
       ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); 
      }else{ 
       ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); 
      } 
     } 
     myTabPosition = tab.getPosition(); 
     ft.replace(R.id.fragment_place, fragment, null);  
     //ft.commit(); 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
     ft.remove(fragment); 
     getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 
} 

उत्तर

13

टुकड़े डिफ़ॉल्ट रूप से एक डिवाइस रोटेशन के बाद बहाल हो जाएगा अगर आप उन्हें फिर से जोड़ नहीं है। आप टुकड़े देखने के लिए एक ही चाहते हैं तो आपको Fragment अपने आप में अपने onSaveInstanceState प्रदर्शन करना चाहिए। Activity में आप की तरह कुछ कर सकते हैं: भले ही आप गतिविधि में onSaveInstanceState ओवरराइड नहीं करते

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState == null) { 
     /* First launch, add fragments */ 
    } else { 
     /* 
      Activity restored, don't add new fragments or in your case, 
      don't make the first tab selected. 
     */ 
    } 
} 

, savedInstanceState मानदंड अभी भी जब एक Activity बहाल करने में गैर-शून्य हो जाएगा। यह सिर्फ खाली Bundle होगा।

एक अन्य विकल्प बाहर स्टोर करने के लिए क्या चयनित टैब सूचकांक है और जब अपनी गतिविधि पुनर्स्थापित किया जाता है कि टैब फिर से चयन किया जाएगा।

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt("CurrentTab", currentTabIndex); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    /* Your existing code */ 

    if(savedInstanceState != null) { 
     int currentTab = savedInstanceState.getInt("CurrentTab", 0); 
     /* Set currently selected tab */ 
    } 
} 

यह मौजूदा टैब फिर से चयन और Fragment कि दिखाया जा रहा था दिखाएगी। इसका एकमात्र नकारात्मक पक्ष यह है कि आपके टुकड़े की स्थिति सहेजी नहीं जाती है। खंड की स्थिति को बचाने के लिए, आपको पहले समाधान की तरह कुछ करना होगा।

+0

कैसे मैं अपने टुकड़ा के राज्य को बचाने के लिए जा रहा हो? ; 'ActionBar.addTab (tabD, 0, सच) के बजाय –

+0

' ऐसा करते हैं: 'अगर (savedInstanceState == नल) {actionBar.addTab (tabD, 0, true);} else {actionBar.addTab (tabD, 0, असत्य); } 'उस मौजूदा टुकड़े को बहाल करने की अनुमति देनी चाहिए। आपका टैब सूचक बंद हो सकता है हालांकि आपको यह निर्धारित करना होगा कि कौन सा संकेत दिया गया है। – MCeley

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