简体   繁体   中英

Android: MessagesFragment doesn't open after receiving command from BroadcastReceiver

BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(MainActivity.this , "Main" , Toast.LENGTH_SHORT).show();

        MessagesFragment messagesFragment = new MessagesFragment();
        getSupportFragmentManager().beginTransaction()
               .add(R.id.fragment_container , messagesFragment)
               .commit();
    }
};

I have passed this broadcast from Recyclerview Adapter onClick to MainActivity . When I click on each item, I can see the toast but the MessagesFragment doesn't start..

You should not using BroadcastReceiver to communicate with Activity from an Adapter. Instead, you need to use Listener/Callback. You can follow something like below.

First, modify your Adapter to add an interface as the listener:

public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {
    // ...

    // Create the listener.
    private OnItemClickListener listener;
    // Define the listener interface
    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    // define the listener to be used by the Activity.
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        ...

        public ViewHolder(final View itemView) {
            ...
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemClick(position);
                        }
                    }
                }
            });
        }
    }

    // ...
}

Then, in your Activity where the adapter reside, you need to set the listener:

YourAdapter adapter = ...;
// populate the adapter
// and anything related to the adapter initialization.

// then set the listener 
adapter.setOnItemClickListener(new YourAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(int position) {
        // Do something when clicked.
        MessagesFragment messagesFragment = new MessagesFragment();
        getSupportFragmentManager().beginTransaction()
               .add(R.id.fragment_container , messagesFragment)
               .commit();
    }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM