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.

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 .

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()); } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.