1
votes

Comment envoyer un utilisateur à ChatActivity en utilisant onClick

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) {


        }
    });


12 commentaires

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 rouge


où 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 rouge


réponse mise à jour.


4 Réponses :


0
votes

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);


0 commentaires

0
votes

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);
}


2 commentaires

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



0
votes

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();


1 commentaires

Où dois-je le mettre?



0
votes

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);
            }
       });


11 commentaires

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.