10

Tôi đang sử dụng trình đơn thả xuống trong mã của mình, trong đó tôi có 4 đến 5 giá trị được điền động, nói rằng nếu tôi đặt "quả táo" thành mặc định và tôi chọn "cam" từ trình đơn thả xuống và xoay màn hình của tôi sang phong cảnh từ dọc Tôi sẽ lưu trạng thái sao cho khi tôi chọn "cam" và xoay sang cảnh quan, nó sẽ điền giá trị đã chọn/vẫn còn trong trạng thái đã chọn và giữ chế độ xem còn nguyên vẹn/điền chế độ xem đã được chọn ở chế độ dọc tương ứng với giá trị đã chọn. Dưới đây là đoạn code adapter tôi sử dụng cho cùng:Làm cách nào để bảo toàn trạng thái của một mục spinner/dropdown đã chọn khi thay đổi hướng?

public class MarketsSpinnerAdapter extends CustomRowAdapter<AdapterRow> { 


    private List<AdapterRow> mRenderList; 

    public MarketsSpinnerAdapter(final Context context, final List<AdapterRow> renderList) { 
     super(context); 


     mRenderList = new ArrayList<AdapterRow>(); 
     mRenderList.addAll(renderList); 
    } 

    @Override 
    protected void setEntries(final List<AdapterRow> renderList) { 
     mRenderList = renderList; 
    } 

    @Override 
    protected List<AdapterRow> getEntries() { 
     return mRenderList; 
    } 

    @Override 
    public View getDropDownView(final int position, final View convertView, final ViewGroup parent) { 
     return getEntries().get(position).getDropDownView(mContext, convertView); 
    } 

} 

Tương ứng với việc sử dụng trong các đoạn tương ứng:

private void populateCategoryRows(final Cursor cursor) { 
      mCategories.clear(); 
      mAllCategories.clear(); 
      cursor.moveToPosition(-1); 
      Map<String, String> categoryParentNames = new HashMap<String, String>(); 

      int selectedPosition = 0; 
      String previousHeader = ""; 
      String previousAllHeader = ""; 

      while (cursor.moveToNext()) { 
       final int categoryLevel = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.LEVEL)); 
       final String categoryName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.NAME)); 
       final String categoryDisplayName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.DISPLAY_NAME)); 

       if (categoryLevel == 1) { 
        categoryParentNames.put(categoryName, categoryDisplayName); 
       } 
      } 

      cursor.moveToPosition(-1); 
      while (cursor.moveToNext()) { 
       final int categoryLevel = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.LEVEL)); 
       final boolean categoryIsDefault = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.IS_DEFAULT)) == 1; 
       final boolean categoryIsSelected = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.IS_SELECTED)) == 1; 
       final String categoryParent = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.PARENT)); 
       final String categoryName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.NAME)); 
       final String categoryDisplayName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.DISPLAY_NAME)); 


       if (categoryLevel == 2) { 
        String categoryParentDisplayName = categoryParentNames.get(categoryParent); 
         if (!categoryParent.equals(previousHeader)) { 
          if (categoryIsSelected) { 

           mCategories.add(new CategoryHeader(categoryParentDisplayName)); 
           previousHeader = categoryParent; 
          } 
         } 

         if (!categoryParent.equals(previousAllHeader)) { 
          mAllCategories.add(new CategoryHeader(categoryParentDisplayName)); 
          previousAllHeader = categoryParent; 
         } 

         if (categoryIsSelected) { 
          mCategories.add(new SpinnerMarketCategoryRow(categoryName, categoryDisplayName, categoryParent)); 
         } 
         mAllCategories.add(new MarketsCategoryCheckableRow(categoryName, categoryDisplayName, categoryIsSelected, categoryIsDefault)); 

         if(categoryIsDefault){ 
          selectedPosition = mCategories.size()-1; 
         } 
       } 
      } 

      mSpinnerAdapter = new MarketsSpinnerAdapter(Application.getAppContext(), mCategories); 
      headerView.setSpinnerAdapter(mSpinnerAdapter); 
      headerView.setSpinnerSelectedItemPosition(selectedPosition); 
     } 
     if (selectedItem instanceof SpinnerMarketCategoryRow) { 
      selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position); 
     } else { 
      if (mSpinnerAdapter.getCount() - 1 >= position + 1) { 
       selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position + 1); 
      } else { 
       selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position - 1); 
      } 
     } 

     final MarketsFragment parentFragment = (MarketsFragment) getParentFragment(); 
     parentFragment.onCategorySelected(selectedCategory.getCategoryName(), selectedCategory.getCategoryParentName()); 
    } 
@Override 
    public void showResults(final Uri uri) { 
     LayoutUtils.showResults(getView(), headerView.getSpinnerId()); 
     headerView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void showNoResults(final Uri uri) { 
     final MarketsFragment parentFragment = (MarketsFragment) getParentFragment(); 
     parentFragment.hideSpinner(); 
     //LayoutUtils.showNoResult(getView(), headerView.getSpinnerId()); 
    } 

    @Override 
    public void onDismiss(DialogInterface dialog) { 
     headerView.setSelected(false); 
    } 
    @Override 
    public void onNothingSelected(IcsAdapterView<?> parent) { 
    } 

Bất kỳ ý tưởng?

Cảm ơn!

Trả lời

17

Bạn có thể làm như thế này ...

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("yourSpinner", yourSpinner.getSelectedItemPosition()); 
    // do this for each or your Spinner 
    // You might consider using Bundle.putStringArray() instead 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // initialize all your visual fields   
    if (savedInstanceState != null) { 
     yourSpinner.setSelection(savedInstanceState.getInt("yourSpinner", 0)); 
     // do this for each of your text views 
    } 
} 

Hope this helps

+1

Spinner của tôi được xác định trong onCreateOptionsMenu. Làm thế nào tôi có thể giải quyết điều đó? – TeodorKolev

+1

Giải pháp này có thể làm cho trình quay số gọi OnItemSelected() nhiều lần. –

+0

@SamRamezanli Một lời giải thích cho biết lý do tại sao phương pháp này có thể được gọi nhiều lần sẽ hữu ích. – Elyasin

0

Nếu cấu hình của thiết bị (theo quy định của Resources.Configuration lớp) thay đổi, sau đó bất cứ điều gì hiển thị một giao diện người dùng sẽ cần Trừ khi bạn chỉ định khác, thay đổi cấu hình (chẳng hạn như thay đổi hướng màn hình, ngôn ngữ, thiết bị đầu vào, v.v.) sẽ khiến hoạt động hiện tại của bạn bị phá hủy, trải qua Activity lifecycle process thông thường của onPause() , onStop() và onDestroy() khi thích hợp.

Nếu hoạt động này đã có mặt tại tiền cảnh hoặc có thể nhìn thấy cho người sử dụng, một khi onDestroy() được gọi là ở chỗ dụ sau đó một trường hợp mới của hoạt động này sẽ được tạo ra, với bất cứ điều gì savedInstanceState các trường hợp trước đây đã tạo từ onSaveInstanceState(Bundle).

Điều này được thực hiện vì mọi tài nguyên ứng dụng, bao gồm tệp bố cục, có thể thay đổi dựa trên bất kỳ giá trị cấu hình nào. Trong một số trường hợp đặc biệt (Giống như bạn, nếu tôi đang đúng, nếu bạn chỉ có spinner/dropdown trên giao diện người dùng hiện tại & bạn không cần phải trải qua chu kỳ hoạt động đầy đủ), bạn có thể muốn bỏ qua khởi động lại hoạt động của mình dựa trên một hoặc nhiều loại thay đổi cấu hình. Điều này được thực hiện với thuộc tính android:configChanges trong tệp kê khai và/hoặc bạn cũng có thể sử dụng onSaveInstanceState(Bundle) là người gọi khi hoạt động bị hủy và tái tạo từ đầu.

Bạn chỉ có hai cách để giải quyết problem_ này

1_

    1. Thêm android: configChanges = "định hướng" trong tập tin Manifest của thẻ hoạt động của bạn.
<?xml version="1.0" encoding="utf-8"?> 
<manifest ... 
> 
<application ... 
    >  
    <activity 
     android:name="SpinnerActivity" 
     android:configChanges="orientation" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 
  • 2, Override onConfigurationChanged, được gọi bởi hệ thống khi thay đổi cấu hình thiết bị trong khi hoạt động của bạn đang chạy.
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    int orientation = newConfig.orientation; 

    switch (orientation) { 
    case Configuration.ORIENTATION_LANDSCAPE: 
     // do what you want when user is in LANDSCAPE 
     break; 

    case Configuration.ORIENTATION_PORTRAIT: 
     // do what you want when user is in PORTRAIT 
     break; 
    } 

} 

2_

Sử dụng phương pháp đặt để lưu trữ các giá trị trong onSaveInstanceState():

protected void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    //Put your spinner values to restore later... 
    savedInstanceState.putLong("yourSpinnerValKey", yourSpinner.getSelectedItemPosition()); 
} 

Và khôi phục các giá trị trong onCreate():

public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState!= null) { 
    //get your values to restore... 
     value = savedInstanceState.getLong("param"); 
    } 
} 

Điều này chắc chắn sẽ giải quyết vấn đề của bạn và nó sẽ không làm mới spinner của bạn khi định hướng màn hình thay đổi. Tôi hy vọng điều này sẽ giúp bạn và tất cả! :)

+0

Trạng thái của spinner được lưu ở đâu? –

+0

@justice, Vui lòng chuyển qua cập nhật ans. –

Các vấn đề liên quan