wake-up-neo.com

Wie behalte ich den Status eines ausgewählten Spinner-/Dropdown-Elements bei einer Änderung der Ausrichtung bei?

Ich verwende ein Spinner-Dropdown in meinem Code, in dem ich 4 bis 5 dynamisch aufgefüllte Werte habe, sagen wir, wenn ich "Äpfel" auf Standard gesetzt habe, und ich wähle "Orangen" aus dem Dropdown und drehe meinen Bildschirm vom Hochformat zum Querformat Die Standardeinstellung für "Äpfel" wird zusammen mit der zugehörigen Ansicht wiederhergestellt. Wie speichere ich den Status so, dass bei Auswahl von "Orangen" und Drehen in Querformat der ausgewählte Wert aufgefüllt wird/im ausgewählten Status bleibt und die Ansicht beibehalten wird intact/füllt die Ansicht, die im Hochformat ausgewählt wurde, entsprechend dem ausgewählten Wert. Hier ist der Adaptercode, den ich für das gleiche verwende:

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 im 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?

Vielen Dank!

12

Sie können dies tun, wie ...

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

Hoffe das hilft

22
umair.ali

Wenn sich die Konfiguration des Geräts (wie in Resources.Configuration class definiert) ändert, muss alles, was eine Benutzeroberfläche anzeigt, aktualisiert werden, damit es mit dieser Konfiguration und Ihrer Activity übereinstimmt, sofern Sie nichts anderes angeben Wenn Sie die Bildschirmausrichtung, Sprache, Eingabegeräte usw. ändern, wird Ihre aktuelle Aktivität zerstört, indem Sie den normalen Activity lifecycle process von onPause (), onStop () und onDestroy () durchlaufen.

Wenn die Aktivität im Vordergrund oder für den Benutzer sichtbar war, wird nach dem Aufruf von onDestroy () in dieser Instanz eine neue Instanz der Aktivität erstellt, und zwar mit dem savedInstanceState vorherige Instanz wurde aus onSaveInstanceState(Bundle) generiert.

Dies geschieht, weil sich jede Anwendungsressource, einschließlich Layoutdateien, basierend auf einem beliebigen Konfigurationswert ändern kann. In einigen besonderen Fällen (genau wie bei Ihnen, wenn ich richtig liege, wenn Sie nur ein Spinner/Dropdown auf der aktuellen Benutzeroberfläche haben und keinen vollständigen Aktivitätslebenszyklus durchlaufen müssen) möchten Sie möglicherweise den Neustart Ihrer Aktivität auf der Grundlage einer solchen umgehen oder mehr Arten von Konfigurationsänderungen. Dies geschieht mit dem Attribut Android: configChanges in seinem Manifest, und/oder Sie können auch onSaveInstanceState (Bundle) verwenden, das aufruft, wenn die Aktivität zerstört wird und von der Zeugung nachgebildet.

Sie haben einfach zwei Möglichkeiten, um dieses Problem zu lösen.

1_

    1. Fügen Sie Android: configChanges = "guidance" in die Manifest-Datei Ihres Aktivitäts-Tags ein.
 <?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 , das vom System aufgerufen wird, wenn sich die Gerätekonfiguration ändert, während Ihre 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_

Verwenden Sie die put-Methoden, um 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 stellen Sie die Werte in onCreate () wieder her:

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

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

0
Rupesh Yadav