Je crée une application de chat et je montre à l'utilisateur ses contacts. À l'heure actuelle, l'utilisateur peut voir le nom de l'image et l'état de tous ses contacts. Mais lorsque l'utilisateur clique sur le contact, je veux qu'il accède à ChatActivity. En ce moment, je suis coincé parce que je ne sais pas comment leur envoyer les leurs.
J'ai essayé ceci
private View ContactsView; private RecyclerView myContactsList; private DatabaseReference ContacsRef, UsersRef; private FirebaseAuth mAuth; private String currentUserID; public ContactsFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment ContactsView = inflater.inflate(R.layout.fragment_contacts, container, false); myContactsList = (RecyclerView) ContactsView.findViewById(R.id.contacts_list); myContactsList.setLayoutManager(new LinearLayoutManager(getContext())); mAuth = FirebaseAuth.getInstance(); currentUserID = mAuth.getCurrentUser().getUid(); ContacsRef = FirebaseDatabase.getInstance().getReference().child("Contacts").child(currentUserID); UsersRef = FirebaseDatabase.getInstance().getReference().child("Users"); return ContactsView; } @Override public void onStart() { super.onStart(); FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Contacts>() .setQuery(ContacsRef, Contacts.class) .build(); FirebaseRecyclerAdapter<Contacts, ContactsViewHolder> adapter = new FirebaseRecyclerAdapter<Contacts, ContactsViewHolder>(options) { @Override protected void onBindViewHolder(@NonNull final ContactsViewHolder holder, int position, @NonNull Contacts model) { String userIDs = getRef(position).getKey(); UsersRef.child(userIDs).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if(dataSnapshot.exists()){ if(dataSnapshot.child("userState").hasChild("state")){ String state = (dataSnapshot.child("userState").child("state")).getValue().toString(); String date = (dataSnapshot.child("userState").child("date")).getValue().toString(); String time = (dataSnapshot.child("userState").child("time")).getValue().toString(); if(state.equals("online")){ holder.onlineIcon.setVisibility(View.VISIBLE); } else if(state.equals("offline")){ holder.onlineIcon.setVisibility(View.INVISIBLE); } } else { holder.userStatus.setText("offline"); } if(dataSnapshot.hasChild("image")){ String userImage = dataSnapshot.child("image").getValue().toString(); String profileName = dataSnapshot.child("name").getValue().toString(); String profileStatus = dataSnapshot.child("status").getValue().toString(); holder.userName.setText(profileName); holder.userStatus.setText(profileStatus); Picasso.get().load(userImage).placeholder(R.drawable.profile_image).into(holder.profileImage); } else{ String profileName = dataSnapshot.child("name").getValue().toString(); String profileStatus = dataSnapshot.child("status").getValue().toString(); holder.userName.setText(profileName); holder.userStatus.setText(profileStatus); } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); } @NonNull @Override public ContactsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.users_display_layout, viewGroup, false); ContactsViewHolder viewHolder = new ContactsViewHolder(view); return viewHolder; } class chatLink implements View.OnClickListener { @Override public void onClick(View v) { SendUserToChatActivity(); } } private void SendUserToChatActivity() { Intent mainIntent = new Intent(getApplication(), MainActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(mainIntent); } }; myContactsList.setAdapter(adapter); adapter.startListening(); } public static class ContactsViewHolder extends RecyclerView.ViewHolder { TextView userName, userStatus; CircleImageView profileImage; ImageView onlineIcon; public ContactsViewHolder(@NonNull View itemView) { super(itemView); userName = itemView.findViewById(R.id.user_profile_name); userStatus = itemView.findViewById(R.id.user_status); profileImage = itemView.findViewById(R.id.users_profile_image); onlineIcon = (ImageView) itemView.findViewById(R.id.user_online_status); } }
Mais cela ne fonctionne pas, les mots setOnClickListener
sont rouges. Quelqu'un peut-il s'il vous plaît aider?
MODIFIER !!!!!!
J'ai essayé les deux réponses ci-dessous et aucune ne m'a aidé. Quand je mets ces blocs
class chatLink implements View.OnClickListener { @Override public void onClick(View v) { SendUserToChatActivity(); } } private void SendUserToChatActivity() { Intent mainIntent = new Intent(ContactsFragment.this, MainActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(mainIntent); finish(); }
Et j'obtiens une ligne rouge sous ici Intent mainIntent = new Intent (ContactsFragment.this, MainActivity.class); code >
Ceci est le code mis à jour (j'essaie toujours de trouver un moyen).
mAuth.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } });
4 Réponses :
Il semble que vous ne manquiez que l'importation appropriée, vous pouvez appuyer sur alt + entrée sur tout ce qui est en rouge pour importer une petite boîte de dialogue ouverte et l'importer.
Vous pouvez soit importer ceci:
Intent mainIntent = new Intent(MyActivityThatContainsThisFragment, MainActivity.class);
Ou vous pouvez implémenter l'interface d'écoute de clic et éviter de créer un nouvel écouteur de clic pour chaque vue comme ceci:
Intent mainIntent = new Intent(context, MainActivity.class);
Si vous souhaitez définir l'écouteur de clic sur l'élément de liste,
class chatLink implements View.OnClickListener { @Override public void onClick(View v) { //Resolve error // you can also use class of fragment i.e. Fragment.this.getContext() SendUserToChatActivity(v.getContext()); } } private void SendUserToChatActivity(Context ctx) { Intent mainIntent = new Intent(ctx, MainActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(mainIntent); finish(); }
EDIT:
Pour votre ChatLink,
L'intention nécessite 2 paramètres pour activité ouverte c.-à-d. classe de contexte et de destination. Alors essayez ceci
import android.view.View.OnClickListener; public static class ContactsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ ...some other code ContactsViewHolder(View itemView){ // some code // setting click listener on complete row itemView.setOnClickListener(this); } @Override public void onClick(View v){ Intent i = new Intent(v.getContext(),ChatActivity.class); v.getContext().startActivity(i); }
Réponse mise à jour, veuillez la vérifier.
Non, il y aura plus d'un utilisateur. Donc, que les amis des utilisateurs soient en ligne ou non s'ils cliquent sur le chat, ils iront à leur chat
Vous devez obtenir le contexte de l'endroit où il se trouve à ce moment au cas où il s'agirait d'un fragment.
Intent mainIntent = new Intent(**getContext()**, MainActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(mainIntent); finish();
Où dois-je le mettre?
Puisque vous voulez que l'adaptateur recyclerView cliquable, vous devez setOnClickListener
dans holder.itemView
. Dans onBindViewHolder
, ajoutez ce
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment ContactsView = inflater.inflate(R.layout.fragment_contacts, container, false); myContactsList = (RecyclerView) ContactsView.findViewById(R.id.contacts_list); myContactsList.setLayoutManager(new LinearLayoutManager(getContext())); mAuth = FirebaseAuth.getInstance(); currentUserID = mAuth.getCurrentUser().getUid(); ContacsRef = FirebaseDatabase.getInstance().getReference().child("Contacts").child(currentUserID); UsersRef = FirebaseDatabase.getInstance().getReference().child("Users"); return ContactsView; } @Override public void onStart() { super.onStart(); FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Contacts>() .setQuery(ContacsRef, Contacts.class) .build(); FirebaseRecyclerAdapter<Contacts, ContactsViewHolder> adapter = new FirebaseRecyclerAdapter<Contacts, ContactsViewHolder>(options) { @Override protected void onBindViewHolder(@NonNull final ContactsViewHolder holder, final int position, @NonNull Contacts model) { final String userIDs = getRef(position).getKey(); UsersRef.child(userIDs).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { if (dataSnapshot.child("userState").hasChild("state")) { String state = (dataSnapshot.child("userState").child("state")).getValue().toString(); String date = (dataSnapshot.child("userState").child("date")).getValue().toString(); String time = (dataSnapshot.child("userState").child("time")).getValue().toString(); if (state.equals("online")) { holder.onlineIcon.setVisibility(View.VISIBLE); } else if (state.equals("offline")) { holder.onlineIcon.setVisibility(View.INVISIBLE); } } else { holder.userStatus.setText("offline"); } if (dataSnapshot.hasChild("image")) { userImage = dataSnapshot.child("image").getValue().toString(); profileName = dataSnapshot.child("name").getValue().toString(); profileStatus = dataSnapshot.child("status").getValue().toString(); holder.userName.setText(profileName); holder.userStatus.setText(profileStatus); Picasso.get().load(userImage).placeholder(R.drawable.profile_image).into(holder.profileImage); } else { profileName = dataSnapshot.child("name").getValue().toString(); profileStatus = dataSnapshot.child("status").getValue().toString(); holder.userName.setText(profileName); holder.userStatus.setText(profileStatus); } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(getContext(), ChatActivity.class); i.putExtra("visit_user_id", userIDs); i.putExtra("visit_user_name", profileName); i.putExtra("visit_image", userImage); startActivity(i); } }); } @NonNull @Override public ContactsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.users_display_layout, viewGroup, false); ContactsViewHolder viewHolder = new ContactsViewHolder(view); return viewHolder; } }; myContactsList.setAdapter(adapter); adapter.startListening(); } public static class ContactsViewHolder extends RecyclerView.ViewHolder { TextView userName, userStatus; CircleImageView profileImage; ImageView onlineIcon; public ContactsViewHolder(@NonNull View itemView) { super(itemView); userName = itemView.findViewById(R.id.user_profile_name); userStatus = itemView.findViewById(R.id.user_status); profileImage = itemView.findViewById(R.id.users_profile_image); onlineIcon = (ImageView) itemView.findViewById(R.id.user_online_status); } }
Code complet
holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(getContext(), ChatActivity.class); i.putExtra("visit_user_id", userIDs); i.putExtra("visit_user_name", profileName); i.putExtra("visit_image", userImage); startActivity(i); } });
Dans quel fichier est-ce que je mettrais ça?
Je le mets dans mon ChatsFragment
et quand je clique sur le contact, rien ne se passe
Mettre en contact
Il y va mais j'obtiens un tas de mots en haut de l'onglet
Oh, je pense que cela montre l'identifiant des utilisateurs au lieu du nom
Vous devez modifier cette ligne i.putExtra ("visit_user_id", userIDs);
. Je mets simplement un userIDs
.
Je l'ai supprimé pour pouvoir mettre le statut à la place, mais cela me montre qu'il n'y a rien avec un statut
Désolé, je ne comprends pas.
Je vois l'identifiant d'utilisateur au lieu du nom, j'ai donc supprimé l'identifiant et mis un statut à la place. Mais je ne peux pas montrer le statut
Ouais en plus
Je vous enverrai un e-mail.
utilisez votre souris, pointez sur la ligne rouge. Qu'est-ce que l'erreur a dit?
Je viens de le survoler et voici le message d'erreur
Impossible de résoudre le constructeur 'Intent (com.example.chatterbox.ContactsFragment, java.lang.Class)'
avez-vous importé l'intention?
Oui, ce
import android.content.Intent;
mais il dit qu'il n'est pas utiliséessayez
Intent mainIntent = new Intent (getApplication (), MainActivity.class);
getApplication
est rougeoù vous appelez
chatLink
? Vous devez transmettre le contexte à cette classe.Je ne l'appelle pas
Voulez-vous voir le fichier entier?
" Voulez-vous voir le fichier entier? " Oui.
Je viens de le mettre à jour. Maintenant, l'intention est affichée comme étant utilisée mais
getApplication
est rougeréponse mise à jour.