Comment conserver l'état d'un élément spinner / dropdown sélectionné lors d'un changement d'orientation?
Je suis l'aide d'une essoreuse à déroulant dans mon code , dans lequel j'ai 4 à 5 rempli dynamiquement les valeurs, disons que si j'ai des "pommes" par défaut et que je sélectionne "oranges" à partir de la liste déroulante et faire tourner mon écran de paysage, de portrait, il remonte à défaut de "pommes" avec la vue associée.Comment puis-je économiser de l'etat, tels que lorsque je sélectionne "oranges" et faire pivoter en mode paysage, il remplit la valeur sélectionnée/reste dans le même état sélectionné et maintient le point de vue intacte/remplit le point de vue qui a été sélectionné dans le mode portrait correspondant à la valeur sélectionnée. Voici la carte code que j'utilise pour la même chose:
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);
}
}
D'utilisation correspondants dans chaque 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) {
}
Des idées?
Merci!
source d'informationauteur Marissa Nicholas
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire cela comme...
Espère que cette aide
Si la configuration de l'appareil (tel que défini par la Les ressources.Configuration classe), alors tout ce qui est de l'affichage d'une interface utilisateur devra mettre à jour pour correspondre à la configuration et à cet effet, votre
Activity
à Moins de spécifier le contraire, un changement de configuration (comme un changement dans l'orientation de l'écran, la langue, les périphériques d'entrée, etc) à cause de votre activité actuelle à être détruit, en passant par la normaleActivity lifecycle process
de onPause(), onStop(), et onDestroy() appropriées.Si l'activité a été à l'avant-plan ou visible pour l'utilisateur, une fois onDestroy() est appelé dans ce cas, une nouvelle instance de l'activité va être créé, avec tout ce que savedInstanceState l'instance précédente a généré de
onSaveInstanceState(Bundle)
.Ce fait, toute demande de ressources, y compris des fichiers de mise en page, peut changer en fonction de la configuration de valeur. Dans certains cas particuliers(comme la votre, si je suis de droite, si vous avez seulement spinner/dropdown sur actuel de l'INTERFACE utilisateur & vous n'avez pas besoin de compléter l'Activité du cycle de vie), vous pouvez contourner le redémarrage de votre activité, fondée sur un ou plusieurs types de modifications de configuration. Cela se fait avec la android:configChanges attribut dans son manifeste, et/ou vous pouvez également utiliser onSaveInstanceState(Bundle) qui est de l'appelant lorsque l'activité est détruit et recréé à partir de l'begening.
Simplement, vous avez deux façons de résoudre ce problem_
1_
2_
Utiliser le placez les méthodes pour stocker des valeurs dans onSaveInstanceState():
Et de restaurer les valeurs dans onCreate():
Ce sera sûrement de résoudre votre problème et il ne permet pas d'actualiser votre spinner lors de l'orientation de l'écran a changé. J'espère que cela va vous aider, vous et tous! 🙂