Quiero agregar un Fragmento a una Actividad que implemente su diseño mediante programación. Revisé la documentación de Fragment pero no hay muchos ejemplos que describan lo que necesito. Aquí está el tipo de código que intenté escribir:
public class DebugExampleTwo extends Activity {
private ExampleTwoFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
if (savedInstanceState == null) {
mFragment = new ExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(frame.getId(), mFragment).commit();
}
setContentView(frame);
}
}
...
public class ExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Hello There");
return button;
}
}
Este código se compila pero se bloquea al inicio, probablemente porque mi FragmentTransaction.add()
es incorrecto. ¿Cuál es la forma correcta de hacer esto?
fuente
ft.add(android.R.id.content, newFragment)
. Solo es necesario crear un diseño personalizado y configurar su id si el contenedor del fragmento no es la vista de contenido de la actividad.Esto es lo que se me ocurrió después de leer el comentario de Tony Wong :
...
...
Kotlin
Si está utilizando Kotlin, asegúrese de echar un vistazo a lo que proporcionan las extensiones de Kotlin de Google o simplemente escriba el suyo.
fuente
if (savedInstanceState == null)
antes de la creación de fragmentos, o después de rotar una pantalla tendrá dos fragmentos o reordenamiento de fragmentos. ¡No use eladd
método en absoluto! Sóloreplace
. O tendrás un comportamiento extraño.backStackStateName
cadena es algo que usted define.main.xml
fuente
Después de leer todas las respuestas, se me ocurrió una manera elegante:
básicamente, no necesita agregar un marco de diseño como contenedor de su fragmento, sino que puede agregar directamente el fragmento al contenedor de vista de raíz de Android
IMPORTANTE: no utilice reemplazar fragmento como la mayoría del enfoque que se muestra aquí, a menos que no le importe perder el estado de instancia de variable de fragmento durante el proceso de recreación .
fuente
utilizar
fuente
Para API nivel 17 o superior,
View.generateViewId()
resolverá este problema. El método de utilidad proporciona una identificación única que no se usa en el tiempo de compilación.fuente
Para adjuntar fragmentos a una actividad mediante programación en Kotlin, puede consultar el siguiente código:
MainActivity.kt
activity_main.xml
FragmentName.kt
Si está familiarizado con las Extensiones en Kotlin, puede incluso mejorar este código siguiendo este artículo.
fuente