tutorial studio propiedades navegar fragments example entre dinamicos desde boton activity abrir android android-fragments android-orientation

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:

  1. haz que tu fragmento sea retenible:

    setRetainInstance(true);

  2. 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) {