web-dev-qa-db-fra.com

Comment obtenir des données de DialogFragment dans un fragment?

Imaginez, j'ai FragmentA à partir duquel je startDialogFragment (il y a EditText dans la boîte). Comment puis-je récupérer la valeur de EditText à FragmentA? J'essaie de faire quelque chose comme ceci et ceci mais je n'ai pas réussi.

25
Kostya Khuta

La méthode Fragment.onActivityResult() est utile dans cette situation. Il faut getTargetRequestCode(), qui est un code que vous configurez entre les fragments pour pouvoir les identifier. De plus, il faut un code de requête, normalement juste 0 si le code a bien fonctionné, puis une Intent, à laquelle vous pouvez aussi attacher une chaîne, comme ceci

Intent intent = new Intent();
intent.putExtra("STRING_RESULT", str);

De plus, la fonction setTargetFragment(Fragment, requestCode) doit être utilisée dans le fragment à partir duquel le résultat est envoyé pour l'identifier. Globalement, vous auriez du code dans le fragment demandeur qui ressemblerait à ceci:

FragmentManager fm = getActivity().getSupportFragmentManager();
DialogFragment dialogFragment = new DialogFragment();
dialogFragment.setTargetFragment(this, REQUEST_CODE);
dialogFragment.show();

La classe pour envoyer des données (le DialogFragment) utiliserait ce fragment que nous venons de définir pour envoyer les données:

private void sendResult(int REQUEST_CODE) {
    Intent intent = new Intent();
    intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString);
    getTargetFragment().onActivityResult(
        getTargetRequestCode(), REQUEST_CODE, intent);
}

Pour recevoir les données, nous utilisons ce type de classe dans le fragment qui a initialement démarré DialogFragment:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Make sure fragment codes match up 
    if (requestCode == DialogFragment.REQUEST_CODE) {
        String editTextString = data.getStringExtra(
            DialogFragment.EDIT_TEXT_BUNDLE_KEY);

À ce stade, vous avez la chaîne de votre EditText de la DialogFragment dans le fragment parent. Utilisez simplement la méthode sendResult(int) dans votre classe TextChangeListener() anonymous pour que le texte soit envoyé lorsque vous en avez besoin.

72
mattpic

Vous devez renvoyer les données de la boîte de dialogue à l'activité via une méthode de rappel, puis demander à l'activité de les restituer au fragment auquel vous souhaitez accéder. Juste un exemple rapide:

public void datFromDialog(String data){
    MyFragment mf = (MyFragment)getFragmentManager().findFragmentById(r.id.frag);

    mf.iWantNewData(data);
}
2
tyczj

En supposant que vous téléchargiez un fichier sur le serveur, une boîte de dialogue devrait s'ouvrir, en cliquant sur le bouton de téléchargement, demandant le titre et une balise facultative.Et la boîte de dialogue elle-même contenant 2 boutons dit annuler et continuer.

personnalisez l'interface utilisateur à l'aide du fichier XML de mise en page.

puis créez une classe qui étend DialogFragment. gonflez la présentation et initialisez les vues dans la méthode onCreateView ().

À l'intérieur de cette classe, créez une interface 

 public interface uploadDialogInterface

   {
       public void senddata(String title, String tag);
   }

    uploadDialogInterface interfaceObj;
    String title="";
    String tag=" ";

Et l’important est de remplacer la méthode onAttach ().

 @Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context=context;
    interfaceObj= (uploadDialogInterface) getTargetFragment();
}

Et dans le bouton, cliquez sur appeler la méthode d'interface comme

     @Override
public void onClick(View v) {
    int id=v.getId();
    if(id== R.id.vB_fud_cancel)
    {
        dismiss();
    }
    else if(id== R.id.vB_fud_upload)
    {
        title=mVideotitle.getText().toString();
        tag=mOptionaltag.getText().toString();
        if(mVideotitle.getText().toString().isEmpty()) {
            Snackbar.make(mVideotitle,"Please enter the video title", Snackbar.LENGTH_SHORT).show();
       }else
        {
            interfaceObj.senddata(title,tag);
            dismiss();

        }
    }
}

Et à l'intérieur du fragment ou de l'activité à partir duquel vous lancez la boîte de dialogue, l'attribut setTargetFragment doit être présent.

private void callUploadDialog()
{
    UploadDialogFragment fragment = new UploadDialogFragment();
    fragment.setTargetFragment(this, 0);
    FragmentManager manager = getFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_in);
    fragment.show(ft, "UploadDialogFragment");
    fragment.setCancelable(false);
}

Et enfin, vous devez implémenter l'interface (déclarée à l'intérieur du fragment de dialogue) et remplacer la méthode

@Override
public void senddata(String title,String optionaltag) {
    this.videoTitle=title;
    this.optionalTag=optionaltag;

}

Je pense que ce post sera utile pour ceux qui utilisent fragment de dialogue pour la première fois. J'ai eu du mal à trouver la solution. Et j'espère que cela résoudra le problème de quelqu'un à l'avenir. (Désolé pour la langue)

2
krishna murthy

L'une des méthodes les plus simples et les plus efficaces consiste à utiliser Android ViewModel.

Cela facilite le partage des données, sans qu'il soit nécessaire d'envoyer des données sur des fragments. Vous pouvez le faire non seulement pour DialogFragments, mais également pour les fragments normaux.

Source: https://developer.Android.com/topic/libraries/architecture/viewmodel

Voici ce que j'ai fait

Mon modèle de vue se présente comme ci-dessous

import Android.Arch.lifecycle.LiveData;
import Android.Arch.lifecycle.MutableLiveData;
import Android.Arch.lifecycle.ViewModel;

public class PlayerViewModel extends ViewModel {
    private final MutableLiveData<Player> selectedPlayer = new MutableLiveData<>();

    public LiveData<Player> getSelectedPlayer() {
        return selectedPlayer;
    }

    public void selectPlayer(Player player) {
        selectedPlayer.setValue(player);
    }
}

Dans le fragment où je sélectionne un lecteur, j'utilise le code suivant dans la méthode onCreate pour lier ViewModel

playerViewModel = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);

Quand un lecteur spécifique est sélectionné, utilisez les (vous pouvez utiliser un ArrayAdapter, un sélecteur DialogFragment ou tout autre élément que vous souhaitez afficher)

playerViewModel = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);

Et enfin, dans le fragment où vous devez afficher les informations sur le lecteur, procédez comme suit dans la méthode onCreate

PlayerViewModel model = ViewModelProviders.of(getActivity()).get(PlayerViewModel.class);
model.getSelectedPlayer().observe(this, new Observer<Player>() {
    @Override
    public void onChanged(@Nullable Player selPlayer) {
        if (selPlayer != null)
            player = selPlayer;
            populateData();
        }
    });
0
Anil Madugula

Cette méthode garantit que le fragment appelant implémente le onChangeListener de la boîte de dialogue.

FragmentA (fragment appelant):

MyDialogFragment f = new MyDialogFragment();
Bundle args = new Bundle();
args.putString("data", data);
f.setArguments(args);
// Set the calling fragment for this dialog.
f.setTargetFragment(FragmentA.this, 0);
f.show(getActivity().getSupportFragmentManager(), "MyDialogFragment");

MyDialogFragment:

import Android.support.v4.app.DialogFragment;

public class MyDialogFragment extends DialogFragment {
    public OnChangeListener onChangeListener;

    interface OnChangeListener{
        void onChange(Data data);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the calling fragment and ensure that it implements onChangeListener.
        try {
            onChangeListener = (OnChangeListener) getTargetFragment();
        } catch (ClassCastException e) {
            throw new ClassCastException(
                "The calling Fragment must implement MyDialogFragment.onChangeListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        .....
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Send the data to the calling fragment.
                onChangeListener.onChange(data);
            }
        });
        .....
    }
}
0
Jeffrey

Ce que vous voulez, selon Développeurs Android ...

0
Informatheus