首页 > 解决方案 > Intent 数据到另一个 Activity 时的异常 android.content.Context.getPackageName()

问题描述

大家好,我正在尝试将数据从适配器获取到 putExtra => Intent 到另一个 Activity,但是每次我尝试从适配器获取数据到 Activity 时,它都会给我这个异常

java.lang.String android.content.Context.getPackageName()'

所以我尝试进入上下文类我发现它太多错误直到现在都无法修复

是什么让我真正相信 Context 的问题在于,当我尝试使用TinyDB时

它需要在适配器内定义对象

tinyDB = 新 TinyDB(mContext);

程序崩溃并给了我这个异常

    W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
W/System.err:     at android.content.ComponentName.<init>(ComponentName.java:128)
                  at android.content.Intent.<init>(Intent.java:4910)
                  at com.team.plustegara.Views.Models.Adapters.EventsAdapter$1.onClick(EventsAdapter.java:83)
                  at android.view.View.performClick(View.java:5647)
                  at android.view.View$PerformClick.run(View.java:22465)
                  at android.os.Handler.handleCallback(Handler.java:754)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:163)
                  at android.app.ActivityThread.main(ActivityThread.java:6238)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)

我试图解决这个问题,但仍然无法处理上下文问题

这是我的适配器

public class EventsAdapter extends RecyclerView.Adapter<EventsAdapter.EventsHolder> {

public EventsAdapter(List<EventsModel> list, Context mContext) {
    this.list = list;
    this.mContext = mContext;
}

private List<EventsModel> list;
private Context mContext;




FirebaseAuth mAuth;
DatabaseReference dbRef;

@NonNull
@Override
public EventsHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.events_row_item, parent, false);
    EventsHolder holder = new EventsHolder(view);
    return holder;

}

@Override
public void onBindViewHolder(@NonNull final EventsHolder holder, int position) {


    final EventsModel listy = list.get(position);


    holder.eventTitle.setText(listy.getTitle());
    holder.eventDate.setText(listy.getEventDate());
    holder.eventCosts.setText("Event Costs " + listy.getCosts());

    Picasso.get()
            .load(listy.getEventImage())
            .fit()
            .centerCrop()
            .placeholder(R.drawable.gradients_card)
            .into(holder.eventImage);

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


            try {

                Intent intent = new Intent(mContext, ShowActivityEvents.class);

                intent.putExtra("EventImage", listy.getEventImage());
                intent.putExtra("EventTitle", listy.getTitle());
                intent.putExtra("EventDate", listy.getEventDate());
                intent.putExtra("EventCosts", listy.getCosts());
                intent.putExtra("EventDescription", listy.getDescription());
                intent.putExtra("eventID", listy.getPostID());
                   mContext.startActivity(intent);

                dbRef = FirebaseDatabase.getInstance().getReference("PlusTeam");
                mAuth = FirebaseAuth.getInstance();


                String userName = mAuth.getCurrentUser().getDisplayName();

                String postID = listy.getPostID();
                dbRef.child("Events").child(postID).child("Views").push().setValue(userName);


            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });



    String postID = listy.getPostID();
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("PlusTeam");
    databaseReference.child("Events").child(postID).child("Views").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            long ViewsCount = dataSnapshot.getChildrenCount();
            holder.txtViews.setText(String.valueOf(ViewsCount));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toasty.error(mContext, databaseError.getMessage(), Toast.LENGTH_LONG).show();
        }
    });


}

@Override
public int getItemCount() {
    return list.size();
}

public class EventsHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.EventImageCard)
    ImageView eventImage;
    @BindView(R.id.txtEventTitle)
    TextView eventTitle;
    @BindView(R.id.txtEventDate)
    TextView eventDate;
    @BindView(R.id.txtEventCosts)
    TextView eventCosts;
    @BindView(R.id.cardView_EventsCard)
    CardView cardViewEvents;
    @BindView(R.id.txtEventsViews) TextView txtViews;

    public EventsHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);



       }
    }


}

这是我的活动,它从适配器接收附加信息

public class ShowActivityEvents extends AppCompatActivity {



DatabaseReference dbRef;
FirebaseAuth mAuth;

@Override
protected void onStart() {
    super.onStart();

    checkIfUserAlreadyAccepttheEvent();

}

private void checkIfUserAlreadyAccepttheEvent() {



    final String postID = getIntent().getExtras().getString("eventID");
    final String UserID = mAuth.getCurrentUser().getUid();


    dbRef.child(postID).child("PeopleComing")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                public static final String TAG = "ShowEvents";

                @SuppressLint("SetTextI18n")
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    Log.e(TAG, "onChildAdded: " + dataSnapshot);

                    String peopleCount = String.valueOf(dataSnapshot.getChildrenCount());
                    txtPeopleComing.setText( peopleCount + " People Comming");

                    if (dataSnapshot.child(UserID).exists()) {

                        btnIamIn.setEnabled(false);



                    } else {
                        btnIamIn.setEnabled(true);
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toasty.error(ShowActivityEvents.this, "Error code : " + 1, Toast.LENGTH_LONG).show();

                }
            });
}



@BindView(R.id.btnIamIn)
Button btnIamIn;
@BindView(R.id.txtPeopleComingCount)
TextView txtPeopleComing;

@BindView(R.id.imgEventPost)
ImageView imgEvent;
@BindView(R.id.txtEventTitle) TextView txtEventTitle;
@BindView(R.id.txtEventDescription) TextView txtEventDescription;
@BindView(R.id.txtEventCost) TextView txtEventCost;
@BindView(R.id.txtEventDate) TextView txtEventDate;
Intent intent;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_events2);



    ButterKnife.bind(this);

    dbRef = FirebaseDatabase.getInstance().getReference("PlusTeam");
    mAuth = FirebaseAuth.getInstance();

    try {
        loadDataFromAdapter();
    } catch (Exception e) {
        e.printStackTrace();
    }


}

private void loadDataFromAdapter() {

    String Image = getIntent().getExtras().getString("EventImage");
    String Title = getIntent().getExtras().getString("EventTitle");
    String Date = getIntent().getExtras().getString("EventDate");
    String Costs = getIntent().getExtras().getString("EventCosts");
    String Description = getIntent().getExtras().getString("EventDescription");


    GlideApp.with(this)
            .load(Image)
            .fitCenter()
            .into(imgEvent);

    txtEventTitle.setText(Title);
    txtEventDescription.setText(Description);
    txtEventDate.setText(Date);
    txtEventCost.setText(Costs);

}

@OnClick(R.id.btnIamIn) public void addPersonToEvent(){


    String UserName = mAuth.getCurrentUser().getDisplayName();
    String userID = mAuth.getCurrentUser().getUid();


    String postID = getIntent().getExtras().getString("eventID");
    dbRef.child(postID)
            .child("PeopleComing").setValue(UserName);
    btnIamIn.setEnabled(false);



  }



}

最后只想说我在 Google 和 Stack 的内部问题中搜索了这种问题,但没有奏效,所以有任何建议

标签: javaandroidandroid-intentandroid-recyclerviewandroid-context

解决方案


您应该在适配器中传递您的上下文,如下例所示

活动

adapter = new EventsAdapter(myList,MainActivity.this);

分段

adapter = new EventsAdapter(myList,getActivity());

或者另一种方式

@Override
public void onClick(View v) {
    v.getContext().startActivity(v.getContext(), ShowActivityEvents.class);
}

推荐阅读