android android-fragments popupwindow

android - Creando correctamente un fragmento en una ventana emergente



android-fragments popupwindow (1)

Soy nuevo en el desarrollo de Android y estoy confundido acerca de cómo lograr lo que estoy tratando de hacer. He leído y aprendido sobre fragmentos para poder compartir diseño y código entre varios diseños de tamaño de pantalla. He creado un par de fragmentos y los he utilizado con éxito. Pero tengo una situación en la que quiero mostrar un fragmento en una actividad normal en el teléfono, pero quiero mostrar el fragmento en una ventana emergente (o algo similar si hay una opción mejor) en una tableta.

Me las arreglé para descubrir cómo inflar el fragmento y mostrarlo en una ventana emergente cuando se hace clic en un botón. Mi código se ve así:

public void onClick(View v) { LayoutInflater inflater = (LayoutInflater) BrowsingActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View popupLayout = inflater.inflate(R.layout.serverconnection_fragment, null, false); connectionListPopup = new PopupWindow(popupLayout, 300, 470, true); connectionListPopup.showAtLocation(BrowsingActivity.this.findViewById(R.id.connectionListImage), Gravity.CENTER, 0, 0); }

La ventana emergente aparece y contiene la IU descrita en serverconnection_fragment.xml. El problema es que al crearlo de esta manera, la clase Fragment ServerConnectionFragment.java nunca se crea una instancia, por lo que no hay elementos en la lista en mi interfaz de usuario, no hay escuchas en los botones, etc. Parece que debería haber una manera de crear una instancia de la clase java, hacer que se infle el fragmento normalmente y adjuntar a los oyentes de eventos, luego pasar la vista creada allí al constructor PopupWindow, pero no puedo entender cómo. ¿Puede alguien ayudarme?

Para su información, estoy construyendo esto para Android 2.1 usando el archivo Android-support-v4.jar para las clases de Fragmento.


Inflar el diseño directamente no lo hará instanciar el fragmento; Android solo consideraría una mera coincidencia que tanto el fragmento como la actividad estén tratando de referirse al mismo archivo de diseño.

Normalmente, usaría FragmentManager.add(int,Fragment) para agregar un fragmento a un diseño. Sin embargo, el identificador de contenedor que especifique debe formar parte del diseño de la Actividad actual, y este no es el caso con un PopupWindow . En su lugar, tendría que agregar el fragmento al administrador de fragmentos sin especificar un contenedor, y luego en algún momento más adelante en el fragmento (por ejemplo, en onStart() ) puede mostrar un PopupWindow. Así es precisamente cómo funciona DialogFragment , y dado que ya hay mucho soporte para eso, le sugiero que cambie a usar un DialogFragment en su lugar.

Con su código de Fragmento, simplemente extienda DialogFragment en lugar de Fragmento, y use DialogFragment.show(FragmentManager,String) para mostrarlo. Puede deshacerse del borde predeterminado llamando a setStyle(DialogFragment.STYLE_NO_FRAME, getTheme()) en el método onCreate . Aún puede agregar este Fragmento a un diseño (como usted dice, en un teléfono que no quiere que se muestre como una ventana emergente) y funcionará como usted espera.