2012-03-22 15 views
23

Quiero iniciar un nuevo fragmento para ver algunos datos. Actualmente, tengo una actividad principal que tiene varias pestañas de la barra de acciones, cada una de las cuales es un fragmento. Entonces, dentro de un fragmento de pestaña, tengo un botón, chartsButton. Tengo mi OnClickListener todo listo para ello, y aquí está el método onClick:Comience un fragmento a través de la intención dentro de un fragmento

public OnClickListener chartsListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     Intent chartFragment = new Intent(); 
     startActivity(chartFragment); 
    } 
}; 

Ahora bien, como ya he dicho, este detector está dentro de una clase que se extiende Fragmento. Entonces, quiero lanzar un nuevo fragmento (chartsFragment) con la intención de reemplazar toda la pantalla. Cuando el usuario haga clic atrás, los devolverá a las pestañas y a la actividad principal. Aquí está mi fragmento de la carta:

public class chartsFragment extends Fragment { 

    public View onCreateView() { 
     //LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState 
     LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     return (inflater.inflate(R.layout.chartfragment, null)); 
    } 
} 

El error actual que estoy tratando con: "android.content.ActivityNotFoundException: no hemos encontrado actividad de manejar Intención {}". Está bien, entiendo que podría usar getActivity(). StartActivity (chartsFragment), pero eso da como resultado el mismo error. Supongo que lo que estoy buscando aquí es cómo lanzar un intento desde dentro de un fragmento que da como resultado la apertura de un nuevo fragmento.

Respuesta

16

No puede abrir nuevos fragmentos. Los fragmentos deben estar siempre alojados por una actividad. Si el fragmento está en la misma actividad (por ejemplo, pestañas), la navegación con la tecla de retroceso será complicada. Supongo que desea abrir una nueva pantalla con ese fragmento.

Así que simplemente crearía una nueva actividad y colocaría el nuevo fragmento allí. Esa actividad entonces reaccionaría a la intención explícitamente a través de la clase de actividad o implícitamente a través de intent filter s.

+0

Esto funcionó a la perfección. Acabo de crear una nueva clase llamada Chart, hice que extendiera Activity, lo coloqué en el Manifest y lo cargué con el diseño xml que tenía pensado para un fragmento. La funcionalidad de respaldo funciona como yo también quería. ¡Muchas gracias! – Davek804

+0

@ Davek804 puede actualizar el código con la solución –

+0

@ Davek804 ¿Puede explicarlo con un diagrama o código? – DroidLearner

49

La respuesta a su problema es fácil: reemplace la actual Fragment con la nueva Fragment y empuje la transacción a la backstack. Esto conserva el comportamiento del botón de retroceso ...

Crear un nuevo Activity realmente frustra el propósito total de usar fragmentos de todos modos ... muy contraproducente.

@Override 
public void onClick(View v) { 
    // Create new fragment and transaction 
    Fragment newFragment = new chartsFragment(); 
    // consider using Java coding conventions (upper first char class names!!!) 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

    // Replace whatever is in the fragment_container view with this fragment, 
    // and add the transaction to the back stack 
    transaction.replace(R.id.fragment_container, newFragment); 
    transaction.addToBackStack(null); 

    // Commit the transaction 
    transaction.commit(); 
} 

http://developer.android.com/guide/components/fragments.html#Transactions

+2

Su trabajo solo cuando ambos fragmentos alojados por la misma actividad – androidXP

+0

Tal vez, pero ¿por qué es digno de mención? Tengo solo una actividad en todas mis aplicaciones. Esa es una especie de punto, ¿no? limitando el número de actividades? – slinden77

5

Prueba esto puede ayudarle a:

public void ButtonClick(View view) { 
    Fragment mFragment = new YourNextFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit(); 
} 
0

Prueba esto puede ayudarle a:

private void changeFragment(Fragment targetFragment){ 

    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.main_fragment, targetFragment, "fragment") 
     .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
     .commit(); 

} 
Cuestiones relacionadas