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.
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.
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);
}
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)
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();
}
});
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);
}
});
.....
}
}
Ce que vous voulez, selon Développeurs Android ...