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);getApplicationest 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
getApplicationest rougeréponse mise à jour.