Obtención de la entrada del usuario desde un cuadro de diálogo utilizando Mortar + Flow
Estoy construyendo mi aplicación con Mortero + Flujo . Estoy tratando de averiguar la forma correcta de mostrar una ventana emergente que solicita algún texto del usuario. He creado esta clase emergente:
public class SavedPageTitleInputPopup implements Popup<SavedPageTitleInput, Optional<String>> { private final Context context; private AlertDialog dialog; public SavedPageTitleInputPopup(Context context) { this.context = context; } @Override public Context getContext() { return context; } @Override public void show(final SavedPageTitleInput info, boolean withFlourish, final PopupPresenter<SavedPageTitleInput, Optional<String>> presenter) { if (dialog != null) throw new IllegalStateException("Already showing, can't show " + info); final EditText input = new EditText(context); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); input.setLayoutParams(lp); input.setText(info.savedPage.getName()); dialog = new AlertDialog.Builder(context).setTitle(info.title) .setView(input) .setMessage(info.body) .setPositiveButton(info.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface d, int which) { dialog = null; final String newTitle = Strings.emptyToNull(String.valueOf(input.getText())); presenter.onDismissed(Optional.fromNullable(newTitle)); } }) .setNegativeButton(info.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface d, int which) { dialog = null; presenter.onDismissed(Optional.<String>absent()); } }) .setCancelable(true) .setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface d) { dialog = null; presenter.onDismissed(Optional.<String>absent()); } }) .show(); } @Override public boolean isShowing() { return dialog != null; } @Override public void dismiss(boolean withFlourish) { dialog.dismiss(); dialog = null; } }
Esta clase funciona como se esperaba. Utiliza SavedPage
para averiguar qué mostrar en el cuadro de diálogo y devuelve la entrada de los usuarios al PopupPresenter
utilizando PopupPresenter # onDismisado cuando se presiona el botón correcto.
- Cómo manejar onActivityResult () con Mortero
- Pruebas de escritura para aplicaciones Flow and Mortar
- Contenedores secundarios en flujo
- ¿Modo recomendado de obtener actividad dentro de la pantalla de mortero?
- Uso de Flow & Mortar con ViewPager
Mi problema es escribir la subclase PopupPresenter
utilizada para presentar el diálogo y procesar la entrada. Esto es lo que tengo ahora mismo:
new PopupPresenter<SavedPage, Optional<String>>() { @Override protected void onPopupResult(Optional<String> result) { if (result.isPresent()) { // The user entered something, so update the API // Oh wait, I don't have a reference to the SavedPage // that was displayed in the dialog! } } }
Como dicen los comentarios, no tengo una referencia a la SavedPage
que se mostró en el diálogo. Se almacenó en el campo whatToShow
en PopupPresenter
, pero este campo se onPopupResult
justo antes de onPopupResult
. Parece que me estaría innecesariamente repitiendo a mí mismo para mantener una copia adicional de la SavedPage
.
- Equivalente de onActivityResult para el mortero y el flujo?
- ¿Puede Flow y Mortero cargar una pantalla en segundo plano si es lento para cargar (por ejemplo, GoogleMap)?
- Table Square Flow + ejemplos de tabletas de mortero
- Bibliotecas de Mortero y Flujo vs. ViewPager
No hay mucha documentación todavía en PopupPresenter y Popup . Lo único que he visto es un ejemplo básico en el proyecto de ejemplo. Crean un ConfirmerPopup basado en datos dentro del objeto de confirmación . El propósito de ConfirmerPopup es capturar una decisión booleana del usuario basada en el título / cuerpo dado al objeto de confirmación como se ve en la declaración de clase.
public class ConfirmerPopup implements Popup<Confirmation, Boolean> {
En su caso, desea capturar texto adicional introducido por el usuario del usuario. Cuando se llama PopupPresenter # onPopupResult el objeto de resultado debe contener todos los datos necesarios de SavedPageTitleInputPopup. Modifique su SavedPageTitleInputPopup como sigue
public class SavedPageTitleInputPopup implements Popup<SavedPage, SavedPageResults> { private final Context context; private AlertDialog dialog; public SavedPageTitleInputPopup(Context context) { this.context = context; } @Override public Context getContext() { return context; } @Override public void show(SavedPage info, boolean withFlourish, final PopupPresenter<SavedPage, SavedPageResults> presenter) { if (dialog != null) throw new IllegalStateException("Already showing, can't show " + info); // Create your Dialog but scrape all user data within OnClickListeners final AlertDialog.Builder builder = new AlertDialog.Builder(context); //Anything else you need to do... .setView() or .setTitle() for example builder.setPositiveButton(info.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface d, int which) { dialog = null; //Save data to SavedPageResults final SavedPageResults results = new SavedPageResults(): presenter.onDismissed(results); } }); builder.setNegativeButton(info.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface d, int which) { dialog = null; final SavedPageResults results = new SavedPageResults(); presenter.onDismissed(results); } }); dialog = builder.show(); } @Override public boolean isShowing() { return dialog != null; } @Override public void dismiss(boolean withFlourish) { dialog.dismiss(); dialog = null; } }
Su PopupPresenter no necesita saber nada sobre la implementación del Diálogo ahora.
new PopupPresenter<SavedPage, SavedPageResults>() { @Override protected void onPopupResult(SavedPageResults result) { if (result.isPresent()) { updateUi(result.getSavedText()); } } }