10

Ich verwende ein Spinner Dropdown in meinem Code, in dem ich 4 bis 5 dynamisch bevölkerte Werte habe, sagen, wenn ich "Äpfel" als Standard eingestellt habe und ich "Orangen" aus dem Dropdown auswähle und meinen Bildschirm von Querformat auf Querformat umstelle , geht es zurück zu Standard "Äpfel" zusammen mit der Ansicht, die damit verbunden ist. Wie speichere ich den Zustand so, dass, wenn ich "Orangen" wähle und zu Querformat rotiere, füllt er den ausgewählten Wert/bleibt im selben ausgewählten Zustand und behält Die Ansicht intakt/füllt die Ansicht, die im Hochformat ausgewählt wurde, entsprechend dem ausgewählten Wert. Hier ist der Adapter Code, den ich für das gleiche verwenden:Wie kann ich den Status eines ausgewählten Drehfelds/Dropdown-Elements bei einer Orientierungsänderung beibehalten?

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

} 

Entsprechende Verwendung in dem jeweiligen Fragment:

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

Irgendwelche Ideen?

Danke!

Antwort

17

Sie können diese wie tun ...

@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 
    } 
} 

this helps

+1

Mein Spinner ist in onCreateOptionsMenu definiert. Wie kann ich das lösen? – TeodorKolev

+1

Diese Lösung kann dazu führen, dass der Spinner die OnItemSelected() mehrfach aufruft. –

+0

@SamRamezanli Eine Erklärung, warum die Methode mehrmals aufgerufen werden könnte, wäre hilfreich. – Elyasin

0

Wenn die Konfiguration des Geräts ändert (wie durch die Resources.Configuration Klasse definiert ist), dann ist alles eine Benutzeroberfläche anzeigt müssen um zu aktualisieren, um diese Konfiguration und damit Ihre Activity Wenn Sie nicht anders angeben, eine Konfigurationsänderung (z. B. eine Änderung der Bildschirmausrichtung, Sprache, Eingabegeräte, etc.) wird Ihre aktuelle Aktivität zerstört werden, durch die normale Activity lifecycle process von onPause() , onStop() und onDestroy() entsprechend.

Wenn die Aktivität hatte im Vordergrund oder für den Benutzer sichtbar gewesen, einmal onDestroy() in diesem Fall aufgerufen wird, dann wird eine neue Instanz der Aktivität geschaffen werden, mit dem, was savedInstanceState die vorherige Instanz erstellt hatte von onSaveInstanceState(Bundle).

Dies wird durchgeführt, da sich jede Anwendungsressource, einschließlich Layoutdateien, basierend auf einem Konfigurationswert ändern kann. In einigen speziellen Fällen (genau wie Ihr, wenn ich richtig komme, wenn Sie nur Spinner/Dropdown auf der aktuellen UI & haben, müssen Sie keinen vollständigen Aktivitätslebenszyklus durchlaufen), möchten Sie vielleicht den Neustart Ihrer Aktivität basierend auf einem umgehen oder mehr Arten von Konfigurationsänderungen. Dies geschieht mit dem android:configChanges Attribut in seinem Manifest und/oder Sie können auch onSaveInstanceState(Bundle) verwenden, die aufrufend ist, wenn die Aktivität zerstört und neu erstellt wird.

Sie haben einfach zwei Art und Weise dieses problem_

1_

    1. hinzufügen android zu beheben: configChanges = "Orientierung" Tag in Manifest-Datei Ihrer Aktivität.
<?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, außer Kraft setzen onConfigurationChanged, die durch das System aufgerufen wird, wenn die Gerätekonfigurationsänderungen, während die Aktivität ausgeführt wird.
@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_

Verwendung der Put-Methoden Werte in onSaveInstanceState zu speichern():

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

und Wiederherstellung der Werte in onCreate():

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

Dies wird Ihr Problem sicher lösen und es wird Ihren Spinner nicht aktualisieren, wenn sich die Bildschirmausrichtung geändert hat. Ich hoffe, das wird dir und allen helfen! :)

+0

Wo wird der Status des Spinner gespeichert? –

+0

@justice, Bitte gehen Sie durch aktualisierte ans. –

Verwandte Themen