android - studio - Manera infalible de manejar el Fragmento en el cambio de orientación
navegar entre fragments android studio (2)
public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
// add menu fragment
MainMenuFragment myFragment = new MainMenuFragment();
fragmentTransaction.add(R.id.menu_fragment, myFragment);
//add content
DetailPart1 content1= new DetailPart1 ();
fragmentTransaction.add(R.id.content_fragment, content1);
fragmentTransaction.commit();
}
public void onMainMenuSelected(String tag) {
//next menu is selected replace existing fragment
}
Tengo la necesidad de mostrar dos vistas de lista una al lado de la otra, el menú a la izquierda y su contenido a la derecha, de manera predeterminada, se selecciona el primer menú y su contenido se muestra en el lado derecho. El fragmento que muestra contenido es el siguiente
public class DetailPart1 extends Fragment {
ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
ListAdapter adap;
ListView listview;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState!=null){
myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
listview.setAdapter(adap);
}else{
//get list and load in list view
getlistTask = new GetALLListTasks().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.skyview_fragment, container,false);
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("MYLIST_obj", myList );
}
}
OnActivityCreated y onCreateView se llaman dos veces , hay muchos ejemplos que usan fragmentos, por lo tanto, soy principiante en este segmento. No puedo relacionar el ejemplo con mi problema. Necesito una forma infalible para manejar el cambio de orientación de una mejor manera. Tengo NO declarado android: configChanges en el archivo de manifiesto, necesito que la actividad se destruya y vuelva a crear para que pueda usar un diseño diferente en modo apaisado. Ayuda a una solución alternativa
Está creando un nuevo fragmento cada vez que gira la pantalla en su actividad en onCreate();
Pero también está manteniendo los antiguos con super.onCreate(savedInstanceState);
. Así que tal vez establezca la etiqueta y encuentre el fragmento si existe, o pase el paquete nulo a super.
Esto me llevó un tiempo aprender y realmente puede ser un bi **** cuando trabajas con cosas como viewpager.
Te recomiendo que leas sobre los fragments un tiempo extra ya que este tema está cubierto.
Aquí hay un ejemplo de cómo manejar fragmentos en un cambio de orientación regular:
Actividad :
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
TestFragment test = new TestFragment();
test.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
} else {
TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
}
}
}
Fragmento :
public class TestFragment extends Fragment {
public static final String KEY_ITEM = "unique_key";
public static final String KEY_INDEX = "index_key";
private String mTime;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, container, false);
if (savedInstanceState != null) {
// Restore last state
mTime = savedInstanceState.getString("time_key");
} else {
mTime = "" + Calendar.getInstance().getTimeInMillis();
}
TextView title = (TextView) view.findViewById(R.id.fragment_test);
title.setText(mTime);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("time_key", mTime);
}
}
Una buena guía sobre cómo retener los datos entre los cambios de orientación y la recreación de la actividad se puede encontrar en las directrices de Android .
Resumen:
haz que tu fragmento sea retenible:
setRetainInstance(true);
Crea un nuevo fragmento solo si es necesario (o al menos toma datos de él)
dataFragment = (DataFragment) fm.findFragmentByTag("data"); // create the fragment and data the first time if (dataFragment == null) {