Je veux que DialogFragment
me renvoie une valeur qui a été entrée dans editQuantity
lors de son rejet.
Mais je ne trouve aucun moyen de le faire fonctionner. Je peux le faire en passant la valeur à travers le intent
mais cela détruit la progression de l'activité en cours.
Existe-t-il un moyen autre que de passer par intent
qui me rendra de la valeur?
package com.example.myprojectname;
import Android.app.AlertDialog;
import Android.app.Dialog;
import Android.content.DialogInterface;
import Android.content.Intent;
import Android.content.DialogInterface.OnClickListener;
import Android.os.Bundle;
import Android.support.v4.app.DialogFragment;
import Android.text.InputType;
import Android.util.Log;
import Android.widget.EditText;
public class QuantityDialogFragment extends DialogFragment implements OnClickListener {
private EditText editQuantity;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
editQuantity = new EditText(getActivity());
editQuantity.setInputType(InputType.TYPE_CLASS_NUMBER);
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.app_name)
.setMessage("Please Enter Quantity")
.setPositiveButton("OK", this)
.setNegativeButton("CANCEL", null)
.setView(editQuantity)
.create();
}
@Override
public void onClick(DialogInterface dialog, int position) {
String value = editQuantity.getText().toString();
Log.d("Quantity: ", value);
dialog.dismiss();
}
}
En supposant que vous souhaitiez transmettre le résultat à l'activité appelante :) essayez cet extrait de code:
public class QuantityDialogFragment extends DialogFragment implements OnClickListener {
private EditText editQuantity;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
editQuantity = new EditText(getActivity());
editQuantity.setInputType(InputType.TYPE_CLASS_NUMBER);
return new AlertDialog.Builder(getActivity()).setTitle(R.string.app_name).setMessage("Please Enter Quantity")
.setPositiveButton("OK", this).setNegativeButton("CANCEL", null).setView(editQuantity).create();
}
@Override
public void onClick(DialogInterface dialog, int position) {
String value = editQuantity.getText().toString();
Log.d("Quantity: ", value);
MainActivity callingActivity = (MainActivity) getActivity();
callingActivity.onUserSelectValue(value);
dialog.dismiss();
}
}
et sur votre activité ajoutez:
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
QuantityDialogFragment dialog = new QuantityDialogFragment();
dialog.show(getSupportFragmentManager(), "Dialog");
}
/**
* callback method from QuantityDialogFragment, returning the value of user
* input.
*
* @param selectedValue
*/
public void onUserSelectValue(String selectedValue) {
// TODO add your implementation.
}
}
Prenant cette idée un peu plus loin, j'ai créé une interface d'écoute dans la boîte de dialogue et l'ai implémentée dans l'activité principale.
public interface OnDialogResultListener {
public abstract void onPositiveResult(String value);
public abstract void onNegativeResult();
}
public void setOnDialogResultListener(OnDialogResultListener listener) {
this.onDialogResultListener = listener;
}
Appelez onNegativeResult () dans une onCancel(DialogInterface)
et onPositiveResult(String)
remplacée où vous souhaitez que votre boîte de dialogue renvoie la valeur.
Remarque: n'oubliez pas de dismiss()
votre boîte de dialogue après avoir appelé onPositiveResult()
ou la fenêtre de dialogue restera ouverte.
Ensuite, dans votre activité principale, vous pouvez créer un écouteur pour la boîte de dialogue, comme ceci:
QuantityDialogFragment dialog = new QuantityDialogFragment();
dialog.setOnDialogResultListener(new QuantityDialogFragment.OnDialogResultListener() {
@Override
public void onPositiveResult(String value) {
//Do something...
}
@Override
public void onNegativeResult() {
//Do something...
}
});
Cela rendra votre dialogue plus facile à réutiliser plus tard.