Je démarre bottomSheetDialogFragment à partir d'un fragment A. Je souhaite sélectionner la date de ce bottomSheetDialogFragment puis la définir dans le fragment A.
La date de sélection est déjà faite, je veux juste la mettre dans le fragment A pour la mettre dans certains champs.
Comment puis-je obtenir la valeur? Des suggestions pour le faire?
Créez une classe d'interface comme celle-ci
public interface CustomInterface {
public void callbackMethod(String date);
}
Implémentez cette interface dans votre Activity
ou Fragment
. et faire un objet de cette interface.
private CustomInterface callback;
Initialisez-le dans onCreate
ou onCreateView
callback=this;
Passez maintenant ce rappel dans votre constructeur BottomSheetDialogFragment
lorsque vous l'appelez.
yourBottomSheetObject = new YourBottomSheet(callback);
yourBottomSheetObject.show(getSupportFragmentManager()," string");
Maintenant dans le constructeur de votre BottomSheetFragment
rappel privé CustomInterface;
public SelectStartTimeSheet(CustomInterface callback){
this.callback=callback;
}
Et enfin, utilisez cet objet de rappel pour définir votre date
callback.callbackMethod("your date");
et vous recevrez cette date dans votre fonction Fragment ou Your Activity in callbackMethod
.
remplacer le constructeur d'un fragment est une mauvaise pratique comme le dit le document:
Chaque fragment doit avoir un constructeur * vide, il peut donc être instancié lors de la restauration de l'état de son * activité.
si vous utilisez un autre constructeur qui passe un rappel comme paramètre, lorsque le fragment est resotoré par le framework, votre application plante
la méthode recommandée consiste à utiliser viewModel et liveata.
vous pouvez utiliser comme suit:
Sélectionnez le code de fragment de compte
class SelectAccountFragment(val clickListener: OnOptionCLickListener) : BottomSheetDialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.bottom_fragment_accounts, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val list = DataProcessorApp(context).allUsers
val rvAccounts = view.findViewById<RecyclerView>(R.id.rvAccounts)
rvAccounts.layoutManager = LinearLayoutManager(context)
rvAccounts.adapter = AccountsAdapter(context, list)
Log.e(tag,"Accounts "+list.size);
tvAccountAdd.setOnClickListener {
val intent = Intent(context,LoginActivity::class.Java)
startActivity(intent)
}
tvManageAccounts.setOnClickListener {
Log.e(tag,"Manage Click")
clickListener.onManageClick()
}
}
interface OnOptionCLickListener{
fun onManageClick()
}
}
Maintenant, affichez et récupérez un autre fragment/activité comme ci-dessous
SelectAccountFragment accountFragment = new SelectAccountFragment(() -> {
//get fragment by tag and dismiss it
BottomSheetDialogFragment fragment = (BottomSheetDialogFragment) getChildFragmentManager().findFragmentByTag(SelectAccountFragment.class.getSimpleName();
if (fragment!=null){
fragment.dismiss();
}
});
accountFragment.show(getChildFragmentManager(),SelectAccountFragment.class.getSimpleName());
Si vous utilisez BottomSheetDialogFragment, car il s'agit d'un fragment, vous devez créer votre interface et vous y associer à la méthode de cycle de vie onAttach du fragment, en effectuant la conversion d'activité appropriée en fonction de votre type d'écouteur/rappel.
Implémentez cette interface dans votre activité et répartissez les modifications lorsque quelqu'un clique sur un élément de la vue intérieure du recyclage d'un fragment, par exemple
C'est un modèle bien connu et mieux expliqué à ici
Un grand conseil est de repenser l'architecture de votre application, car la meilleure approche consiste à toujours passer des données primitives/simples/minuscules entre Android composants via Bundle, et vos composants sont en mesure de récupérer l'état requis avec leur dépendances plus tard.
Par exemple, vous ne devez jamais transmettre de gros objets comme des bitmaps, des classes de données, des DTO ou des références de vue.
J'espère que cela pourra aider!
Vous pouvez également utiliser LocalBroadcastManager . Et comme l'a dit hglf, il est préférable de conserver le constructeur vide pour votre fragment et d'utiliser newInstance (Type value) à la place pour instancier votre fragment si vous souhaitez toujours utiliser la méthode d'interface callBack.