web-dev-qa-db-fra.com

Obtenir de la valeur à partir du fragment de boîte de dialogue Feuille inférieure

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?

10
Abdulrahman

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.

12
AbhayBohra

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.

2
hglf

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());
1
imran khan

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.

  • il y a d'abord un processus de sérialisation en cours concernant Parcel qui a un impact sur la réactivité de l'application
  • en second lieu, cela peut vous conduire à TransactionTooLarge type d'erreur.

J'espère que cela pourra aider!

1
william gouvea

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.

0
Abdelkader