web-dev-qa-db-fra.com

Obtenez de la valeur de DialogFragment

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();       
    }
}
22
Homam

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.
    }
}
49
Anis BEN NSIR

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.

4
mrolcsi