android - tiene - ¿Cómo puedo preservar el estado de un elemento giratorio/desplegable seleccionado en el cambio de orientación?
en cuanto tiempo se carga un celular (2)
Estoy usando un menú desplegable de spinner en mi código, en el que tengo de 4 a 5 valores dinámicamente poblados, por ejemplo, si tengo "manzanas" configuradas como predeterminadas y selecciono "naranjas" del menú desplegable y giro la pantalla al paisaje desde el retrato, vuelve a las "manzanas" predeterminadas junto con la vista asociada a él. Cómo guardo el estado de modo que cuando selecciono "naranjas" y gire a horizontal, rellena el valor seleccionado / permanece en el mismo estado seleccionado y mantiene la vista intacta / rellena la vista que se seleccionó en el modo vertical correspondiente al valor seleccionado. Aquí está el código de adaptador que uso para el mismo:
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);
}
}
Uso correspondiente en el fragmento respectivo:
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) {
}
¿Algunas ideas?
¡Gracias!
Puedes hacer esto como ...
@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
}
}
Espero que esto ayude
Si la configuración del dispositivo (según lo definido por la clase Resources.Configuration ) cambia, todo lo que muestre una interfaz de usuario deberá actualizarse para coincidir con esa configuración y su Activity
A menos que especifique lo contrario, un cambio de configuración (como un cambio en orientación de la pantalla, idioma, dispositivos de entrada, etc.) hará que se destruya su actividad actual, pasando por el Activity lifecycle process
normal del Activity lifecycle process
de Activity lifecycle process
de onPause (), onStop () y onDestroy () según corresponda.
Si la actividad ha estado en primer plano o es visible para el usuario, una vez que se invoque onDestroy () en esa instancia, se creará una nueva instancia de la actividad, con cualquier instancia de instancia guardada que la instancia previa haya generado desde onSaveInstanceState(Bundle)
.
Esto se hace porque cualquier recurso de la aplicación, incluidos los archivos de diseño, puede cambiar en función de cualquier valor de configuración. En algunos casos especiales (al igual que el tuyo, si estoy acertando, si solo tienes un girador / menú desplegable en la interfaz de usuario actual y no necesitas pasar por el ciclo de vida completo de la actividad), es posible que desees evitar reiniciar tu actividad en función de uno o más tipos de cambios de configuración. Esto se hace con el atributo android: configChanges en su manifiesto y / o también puede usar onSaveInstanceState (Bundle) que llama cuando se destruye la actividad y se recrea a partir de la begening.
Simplemente tiene dos formas de resolver este problema_
1_
- Agregue android: configChanges = "orientation" en el archivo de Manifiesto de su etiqueta de Actividad.
<?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, Anular onConfigurationChanged , que el sistema llama cuando la configuración del dispositivo cambia mientras se está ejecutando su actividad.
@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_
Use los métodos put para almacenar valores en onSaveInstanceState ():
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
//Put your spinner values to restore later...
savedInstanceState.putLong("yourSpinnerValKey", yourSpinner.getSelectedItemPosition());
}
Y restaurar los valores en onCreate ():
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState!= null) {
//get your values to restore...
value = savedInstanceState.getLong("param");
}
}
Esto seguramente resolverá su problema y no actualizará su ruleta cuando cambie la orientación de la pantalla. ¡Espero que esto te ayude a ti y a todos! :)