java - 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 的内部问题中搜索了这种问题,但没有奏效,所以有任何建议
解决方案
您应该在适配器中传递您的上下文,如下例所示
活动
adapter = new EventsAdapter(myList,MainActivity.this);
分段
adapter = new EventsAdapter(myList,getActivity());
或者另一种方式
@Override
public void onClick(View v) {
v.getContext().startActivity(v.getContext(), ShowActivityEvents.class);
}
推荐阅读
- python - Django 2.0 中这些 LoginRequiredMixin 属性的用途是什么?
- python - ImportError:安装pymongo,python 2.7时没有名为parse的模块
- c++ - arduino中的多个按钮按下管理
- php - 在 php 对象中,为什么静态变量只能用 :: 表示法访问,而静态方法可以从 :: & -> 中调用
- bash - 使用 awk 更改最后一条记录分隔符
- ruby-on-rails - Rails:如何链接到静态页面
- javascript - 在没有 div 的情况下使用 React 的 dangerouslySetInnerHTML?
- testing - 如何确保所有情况都包含在基于事件的并发设置中?
- firebase - 可以在 Firebase 分析中注册多少个自定义参数?
- amazon-web-services - 为什么附加到 IAM 用户的此策略不起作用