我尝试从我的类 MyFirebaseMessaging.java 中自动执行一个方法,该方法通过云接收 firebase 消息,当它到达时所有这些代码都被激活,执行 Home 中的方法。
错误是,当我仍然声明 onCreate 并全局声明变量 CardView cardUDatos 时,它告诉我:
E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.CardView.setVisibility(int)' on a null object reference
MyFirebaseMessaging.java
public class MyFirebaseMessaging extends FirebaseMessagingService {
@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {
if(remoteMessage.getData() != null) {
Map<String,String> data = remoteMessage.getData();
String title = data.get("title");
final String message = data.get("message");
if (title.equals("Aceptar")) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Home SDI = new Home();
SDI.MostrarDatos();
}
});
}
}
}
}
Clase Home.java donde esta el layout
CardView cardUDatos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
{
.
.
.
cardUDatos = (CardView) findViewById(R.id.cardview_user);
.
.
.
}
public void MostrarDatos(){ DatabaseReference UserInformation = FirebaseDatabase.getInstance().getReference(Common.User);
UserInformation.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
List<Object> map = (List<Object>) dataSnapshot.getValue();
String name
name = String.valueOf(map.get(2).toString());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// ...
}
});
cardUDatos.setVisibility(View.VISIBLE);
}
最佳答案
问题出在下面一行:
Home SDI = new Home();
您不应该尝试以这种方式访问 Activity。这只会创建 Activity 的实例。此实例与实际 Activity (如果在前台运行)没有任何关系。生命周期方法不会被调用,因此您的 cardUDatos
不会被初始化。
一种方法是实现LocalBroadcastReceiver
。引用这个SO实现细节
关于android - 调用 setVisibility 类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51529248/