2011-10-17 14 views
14

Tengo una aplicación simple que tiene dos fragmentos y cuando está en modo horizontal, ambos fragmentos se muestran uno al lado del otro y en retrato muestro el Fragmento A y luego, si seleccionan una opción, comienzan una Actividad que muestra el Fragmento B. Mi problema es cuando estoy en el modo Retrato y muestra el Fragmento B, si el usuario selecciona una opción de menú, quiero actualizar o volver a dibujar la Vista que está asociada con el Fragmento B y no puedo entender cómo hacer que esto funcione. Probé el método getView y el método getLayoutInflater, pero la pantalla no cambia porque creo que estoy creando una nueva vista. También traté de obtener una referencia al Fragmento A pensando que podría llamar a su rutina para construir un nuevo fragmento y reemplazar el Fragmento B, pero no puedo obtener una referencia porque no se muestra. Lo que realmente necesito hacer es forzar el método onCreateView para que se vuelva a llamar para inflar la nueva vista, pero he intentado varios métodos para intentar hacer esto, pero no puedo hacer que se llame nuevamente a onCreateView. ¿Alguna idea sobre cómo hacer esto?Fragmento de fuerza de Android para reconstruir Vista

Respuesta

1

si el usuario selecciona una opción de menú que desea actualizar o volver a dibujar la vista que se asocia con el fragmento B y no puede entender cómo hacer este trabajo

En onOptionsItemSelected(), tienen la llamada actividad un método en el fragmento que hace que actualice sus widgets con el nuevo contenido. O bien, haga que la actividad ejecute un FragmentTransaction para reemplazar el fragmento (si el fragmento se configuró originalmente a través de un FragmentTransaction).

9

Usted tendrá que realizar una FragmentTransaction y utilizar el método de replace()

Esto no debería ser demasiado difícil de hacer, pero la respuesta dependerá del lugar donde se encuentra su menú (es decir, es su llamada onOptionsItemSelected() nuevo hacia el interior Actividad principal o ¿está en el Fragmento A/B?).

Supongamos, por simplicidad, que su implementación de menú y onOptionsItemSelected() están en la actividad padre, y desea remodelar los fragmentos en caso de que se elija menú_opción1. Se vería algo como esto:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 

Alternativamente, si su menú es un hijo de uno de sus fragmentos (que debería ser para el bien de un código más reutilizable), a continuación, un método consiste en exigir que la actividad de acogida para implementar una interfaz definida por el Fragmento, que se puede utilizar como una devolución de llamada. Y en la devolución de llamada onOptionsItemSelected() dentro de su clase de fragmento, simplemente realiza una llamada a este método de devolución de llamada.

Aunque suena como un bocado, solo necesitas hacer un par de cosas. Haga de cuenta que esta es la clase Fragmento

public static class FragmentA extends ListFragment { 
OnSelectedListener mListener; 
// Container Activity must implement this interface 
public interface OnSelectedListener { 
    public void onSelected(); 
} 
... 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    //This is to ensure that the Activity has implemented the interface we set up above 
    try { 
     mListener = (OnSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnSelectedListener"); 
    } 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    getActivity().onSelected(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 
... 
} 

Luego, en la actividad, que se vería algo como:

public class MainActivity extends Activity implements FragmentA.onSelectedListener{ 
... 
public void onSelected(){ 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
} 
+7

Cuando va a sustituir R.id.your_fragment_id, que están asumiendo que fue declarado en XML . Pero, ¿y si mi fragmento original se construyó programáticamente? –

+1

@IgorGanapolsky esta será la identificación para el contenedor de ese fragmento – dmSherazi

Cuestiones relacionadas