2012-02-01 23 views
7

Me gustaría utilizar una actividad que contenga varios fragmentos y navegar entre los fragmentos. Por ejemplo, en la actividad, hay una vista de lista que es un fragmento, cuando el usuario selecciona un elemento de la lista, la vista navegará a otro fragmento. ¿Cómo podría implementarse esto?Navegar entre fragmentos dentro de una actividad

Sé que hay un bonito tutorial en el sitio del desarrollador, pero maneja la pantalla de la tableta en la que dos paneles presentan un fragmento de lista y un fragmento detallado en una pantalla. Solo quiero navegar entre fragmentos sin mostrar dos fragmentos en una pantalla.

¿Hay tutoriales que me puedan enseñar cómo hacerlo?

+0

Pero ese tutorial es perfectamente válido si solo observa el diseño del retrato. – Warpzit

+0

@ Warpzit, pero el tutorial me pide que cree dos actividades en formato vertical, cada una para cada fragmento, ¿no? –

Respuesta

11

En pocas palabras, la respuesta a su pregunta es notificar su actividad de host y luego hacer que su actividad de host reemplace su contenedor de fragmentos actual mediante FragmentManager.

Uno de los enfoques es hacer una interfaz en su primer fragmento, hacer que su actividad de host registre/escuche (implementar) a esta interfaz y luego tener su FragmentManager para reemplazar el contenido del contenedor con el segundo fragmento en la devolución de llamada del oyente.

No estoy seguro acerca de tutorial, pero aquí es mi fragmento: primer fragmento

public class First extends Fragment{ 
private static onMySignalListener listener; 

//call this function from whatever you like i.e button onClickListener 
public void switchWindow() { 
    if(listener != null){ 
     listener.onMySignal(); 
    } 
} 

public interface onMySignalListener { 
    //customize this to your liking 

    //plain without argument 
    void onMySignal(); 

    //with argument 
    void onMySignalWithNum(int mNum); 
} 

public static void setOnMySignalListener(onMySignalListener listener) { 
    First.listener = listener; 
}} 

anfitrión Actividad

public class HostActivity extends FragmentActivity implements onMySignalListener{ 
private final String ADD_TAG_IF_NECESSARY = "mTag"; 

@Override 
public void onCreate(Bundle ssi) { 
    setContentLayout(R.layout.main); 

    FirstFragment.setOnMySignalListener(this); 
} 

@Override 
public void onMySignal() { 
    //if you're using compat library 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 

    //initialize your second fragment 
    sfragment = SecondFragment.newInstance(null); 
    //replace your current container being most of the time as FrameLayout 
    transaction.replace(R.id.container, fragment, ADD_TAG_IF_NECESSARY); 
    transaction.commit(); 
} 

@Override 
public void onMySignalWithNum(int mNum) { 
    //you can do the same like the above probably with your own customization 
}} 

Esto es sólo un ejemplo de cómo le gustaría implementar la interfaz, por favor arreglarlo por ti mismo. Y tenga en cuenta que esto no es efectivo si tiene muchos fragmentos que desean notificar a su actividad de host sobre algo. hacerlo lo llevará a implementar varios oyentes a su actividad de host.

+0

Hola, si tengo muchos fragmentos (alrededor de 5) quiero notificar a mi actividad de host, ¿cómo puedo implementarlos? –

+0

y ¿Puedo usar fragment's onAttach() para establecer en el oyente la actividad del host en lugar de su método de configuración personalizada? –

+1

Bueno, el sistema notificador más sofisticado de la API de Android usa BroadcastReceiver. Puede reemplazar la interfaz/escucha Java convencional utilizando esta clase. Registre un receptor en su actividad de host y de sus cinco o más fragmentos, simplemente puede enviar difusión. Para diferenciar entre su fragmento, puede usar Intent que se envía junto con el método sendBroadcast. Mira esto: [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) y probablemente busquen un ejemplo en Google, no puedo publicar mi ejemplo en comentarios, aplausos. –

5
I think this will be useful for you. 

example of two fragments in one screen works independently 
=========================================================== 

public class MainActivity extends Activity { 

    enter code here 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 

     Fragment newFragment = new Test(); 
     FragmentTransaction transaction = getFragmentManager() 
       .beginTransaction(); 
     transaction.add(R.id.UprLayout, newFragment); 
//  transaction.addToBackStack(null); 
     transaction.commit(); 

     Fragment newFragment2 = new TestRight(); 
     FragmentTransaction transaction2 = getFragmentManager() 
       .beginTransaction(); 
     transaction2.add(R.id.dwnLayout, newFragment2); 
//  transaction.addToBackStack(null); 
     transaction2.commit(); 


    } 
} 

----------------------------- 
main_activity layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center|center_horizontal" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/UprLayout" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" > 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/dwnLayout" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" > 

    </LinearLayout> 

</LinearLayout> 

------------------------------------ 
public class Test extends Fragment { 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
    } 

TextView tv; 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.test, container, false); 
     return view;   
    } 
} 
--------------------------- 

public class TestRight extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.test_right, container, false); 
     return view; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Button button = (Button)getActivity().findViewById(R.id.button1); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Fragment newFragment = new Right2nd(); 
       FragmentTransaction transaction = getFragmentManager() 
         .beginTransaction(); 
       transaction.replace(R.id.dwnLayout, newFragment); 
       transaction.addToBackStack("aa"); 
       transaction.commit(); 

//    transaction.add(R.id.frag, newFragment).commit(); 
      } 
     }); 
    } 

} 
------------------------------- 
test layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 
    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_horizontal" 
     android:text="test" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="50sp" /> 

</LinearLayout> 
------------------------------------ 
test_right layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test right" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="45sp" /> 

</LinearLayout> 
------------------------------------- 
public class Right2nd extends Fragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View vw= inflater.inflate(R.layout.right_2nd, container, false); 
     return vw; 
    } 
} 
------------------------------------------- 
right_2nd layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 


    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Right 2nd" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="50sp" /> 

</LinearLayout> 

-------------------------------------------- 
Cuestiones relacionadas