6

Tôi đang có điều hướng thả xuống của thanh tác vụ. Vấn đề là khi tôi chuyển sang một đoạn khác, sau đó thực hiện một thay đổi định hướng, nó đặt mảnh đầu tiên bên trong anyways, mặc dù tôi nghĩ rằng tôi đang lưu saveInstanceState một cách chính xác. Vấn đề có vẻ là onNavigationItemSelected được gọi, vì vậy .. làm thế nào tôi sẽ xử lý chính xác điều này? Tôi có thể làm biến savedInstanceState một lĩnh vực, nhưng điều đó chỉ cảm thấy sai ...Điều hướng thả xuống của ActionBar - thay đổi hướng đặt sai phân đoạn trong

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

}

Trả lời

2

Gần đây tôi đã gặp phải vấn đề này là tốt. Tôi đã giải quyết nó bằng cách ghi đè phương thức onRetainCustomNonConfigurationInstance trên hoạt động.

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

Trong onCreate tôi là sau đó có thể thực hiện như sau:

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

Cuối cùng tôi cập nhật onNavigationItemSelected để nó biết về mIsOrientationChange

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

    mIsOrientationChange= false; 

    return true; 
} 

Edit: Tôi nảy sinh ý tưởng triển khai điều này từ bài viết dành cho nhà phát triển Android sau đây: http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

+0

Xin chào, những gì tôi thực sự đã làm là duy trì chỉ mục của mục được chọn trong trình đơn thả xuống trong lưu trữ được lưu trữ – urSus

+0

Tôi cũng đang làm điều này (thực sự tôi đã lưu trữ chỉ mục dưới dạng SharedPreference để nó có thể được sử dụng khi khởi động ứng dụng nếu nó đã được mở sau đó khi không còn chạy trong bộ nhớ). Vấn đề tôi phải đối mặt là có một chút khác biệt ở chỗ mảnh nhìn thấy được có thể bắt đầu một mảnh con khác. Khi quay, nó sẽ quay trở lại đoạn cha mẹ thay vì đứa trẻ, đoạn mã trên cho phép tôi làm việc xung quanh vấn đề thứ hai đó. –

+0

Điều này làm cho đoạn sai được hiển thị trong trình đơn thả xuống trên thanh hành động. – howettl