6

में गलत खंड डालता है मेरे पास एक एक्शनबार ड्रॉपडाउन नेविगेशन है। समस्या तब होती है जब मैं एक अलग टुकड़े पर स्विच करता हूं, फिर एक अभिविन्यास परिवर्तन करता हूं, यह पहले खंड को किसी भी तरह से रखता है, भले ही मुझे लगता है कि मैं सहेजे गए इंस्टेंसस्टेट को सही तरीके से सौंप रहा हूं। समस्या यह प्रतीत होती है कि NavigationItem पर चयन किया जाता है, तो .. मैं इसे सही ढंग से कैसे संभालेंगे? मैं savedInstanceState चर एक क्षेत्र बना सकता है, लेकिन यह सिर्फ गलत लगता है ...एक्शनबार ड्रॉप डाउन नेविगेशन - ओरिएंटेशन चेंज

public class MainActivity extends FragmentActivity implements MyListFragment.OnArticleSelectedListener { 

public static final String TAG = "MainActivity"; 

@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if(savedInstanceState != null) { 
     Fragment savedFragment = getSupportFragmentManager().getFragment(savedInstanceState, "saved_fragment"); 
     Log.d(MainActivity.TAG, "savedInstanceState != null: " + savedFragment.getTag()); 

     getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.fragment_container, savedFragment, savedFragment.getTag()) 
     .commit(); 
    } else { 

     Log.d(MainActivity.TAG, "savedInstanceState == null"); 

     getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.fragment_container, new MyListFragment(), MyListFragment.TAG) 
     .commit(); 
    } 

    ActionBar actionBar = getActionBar(); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 

    String[] array = new String[] { "Inzeráty", "Dummy frag" }; 
    SpinnerAdapter mSpinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, 
      array); 

    actionBar.setListNavigationCallbacks(mSpinnerAdapter, new ActionBar.OnNavigationListener() { 

     @Override 
     public boolean onNavigationItemSelected(int itemPosition, long itemId) { 

      Log.d(MainActivity.TAG, "onNavitagionItemSelected"); 

      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      switch(itemPosition) { 
       case 0: 
        transaction.replace(R.id.fragment_container, new MyListFragment(), MyListFragment.TAG); 
        break; 
       case 1: 
        transaction.replace(R.id.fragment_container, new MyDummyFragment(), MyDummyFragment.TAG); 
        break; 
      } 
      transaction.commit(); 
      return true; 
     } 

    }); 

} 

@Override 
public void onArticleSelected(Bundle bundle) { 
    Log.d(MainActivity.TAG, "MainActivity # onArticleSelected"); 
    Intent intent = new Intent(this, DetailActivity.class); 
    intent.putExtras(bundle); 
    startActivity(intent); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); 
    Log.d(MainActivity.TAG, "MainActivity # onSaveInstanceState: " + currentFragment.getTag()); 
    getSupportFragmentManager().putFragment(outState, "saved_fragment", currentFragment); 
    super.onSaveInstanceState(outState); 
} 

}

उत्तर

2

मैं हाल ही में इस समस्या के साथ-साथ सामना करना पड़ा। मैंने गतिविधि पर onRetainCustomNonConfigurationInstance विधि को ओवरराइड करके इसे संबोधित किया।

... 
Object lastCustomNonConfigurationInstance = getLastCustomNonConfigurationInstance(); 
if (lastCustomNonConfigurationInstance != null) { 
    mIsOrientationChange = (Boolean) getLastCustomNonConfigurationInstance(); 
} 
... 

अन्त में मैं onNavigationItemSelected तो अद्यतन कि यह जानता था के बारे में mIsOrientationChange

@Override 
public boolean onNavigationItemSelected(int position, long id) { 
    if (!mIsOrientationChange) { 
     // real navigation selected logic   
    } 

    mIsOrientationChange= false; 

    return true; 
} 

संपादित करें:: मैं करने के लिए विचार आया

@Override 
public Object onRetainCustomNonConfigurationInstance() { 
    // return true so that onCreate will know it is an orientation change 
    return true; 
} 

मेरी onCreate में मैं उसके बाद निम्न को लागू करने में सक्षम था निम्न एंड्रॉइड डेवलपर आलेख से इसे कार्यान्वित करें: http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

+0

नमस्ते, जो मैंने वास्तव में समाप्त किया था वह सहेजे गए इंस्टेंसेंस – urSus

+0

में ड्रॉपडाउन में चुने गए आइटम की अनुक्रमणिका को जारी रख रहा था। मैं यह भी कर रहा था (वास्तव में मैंने इंडेक्स को साझा प्रेफरेंस के रूप में संग्रहीत किया ताकि इसका उपयोग ऐप शुरू करने पर किया जा सके बाद में खोला गया था जब स्मृति में नहीं चल रहा था)। जिस समस्या का सामना करना पड़ रहा था वह थोड़ा अलग है जिसमें दिखाई देने वाला टुकड़ा एक और बच्चा टुकड़ा शुरू कर सकता है। घूर्णन पर यह फिर बच्चे के बजाय पैरेंट टुकड़े पर वापस जायेगा, ऊपर दिए गए कोड ने मुझे उस दूसरे मुद्दे के आसपास काम करने की अनुमति दी। –

+0

यह क्रिया खंड पर ड्रॉप डाउन मेनू में गलत टुकड़ा प्रदर्शित होने का कारण बनता है। – howettl

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