Как отправить пользователя в ChatActivity с помощью onClick - PullRequest
1 голос
/ 17 мая 2019

Я создаю приложение чата и показываю пользователю его контакты.Прямо сейчас пользователь может видеть имя изображения и статус всех своих контактов.Но когда пользователь нажимает на контакт, я хочу, чтобы он перешел в ChatActivity.Прямо сейчас я застрял, потому что я не знаю, как отправить им их.

Я пробовал это

mAuth.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


        }
    });

Но это не работает, слова setOnClickListener красного цвета.Может кто-нибудь, пожалуйста, помогите?

РЕДАКТИРОВАТЬ !!!!!!

Я попробовал оба из приведенных ниже ответов, и ни один из них не помог мне.Когда я ставлю эти блоки

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

И здесь я получаю красную линию Intent mainIntent = new Intent(ContactsFragment.this, MainActivity.class);

Это обновленный код (я все еще пытаюсь найти способ).

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

Ответы [ 4 ]

0 голосов
/ 20 мая 2019

Поскольку вы хотите, чтобы на recyclerView можно было нажимать адаптер, вам необходимо setOnClickListener in holder.itemView. Внутри onBindViewHolder, добавьте

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

Полный код

 @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);
        }
    }
0 голосов
/ 18 мая 2019

Если вы хотите установить прослушиватель щелчков на элементе списка, тогда

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

РЕДАКТИРОВАТЬ:

Для вашего ChatLink,

Intent требуется 2 параметра для открытия действия, т.е. Contextи класс назначения.Так что попробуйте это

 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();
        }
0 голосов
/ 18 мая 2019

Вы должны получить контекст, где он находится в данный момент, если это фрагмент.

Intent mainIntent = new Intent(**getContext()**, MainActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainIntent);
finish();
0 голосов
/ 17 мая 2019

Похоже, что вы пропустили только правильный импорт, вы можете нажать alt + , введите для всего, что выделено красным, чтобы импортировать открытое маленькое диалоговое окно и импортировать его.

Вы можете импортировать это:

import android.view.View.OnClickListener;

Или вы можете реализовать интерфейс прослушивателя кликов и избегать создания нового прослушивателя кликов для каждого вида, подобного этому:

class yourClass implements View.OnClickListener {

@Override           
public void onClick(View v) {
    //Views clicks go here           
    }
}

Edit:

Вам нужно заменить свой первый параметр в своем намерении и передать контекст.

Заменить это:

 Intent mainIntent = new Intent(ContactsFragment.this, MainActivity.class);

с этим:

 Intent mainIntent = new Intent(context, MainActivity.class);

Обратите внимание, что вам придется передавать контекст, а не только ключевое слово "context", например, вы можете передать свою текущую активность следующим образом:

 Intent mainIntent = new Intent(MyActivityThatContainsThisFragment, MainActivity.class);
...