android - 调用 setVisibility 类时出错

标签 android

我尝试从我的类 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/

相关文章:

java - 在游戏线程上处理 MotionEvent

android - buildPreBundle 重复条目失败 : META-INF/MANIFEST. MF

Android从其父 Activity 刷新 fragment 列表

android - Material Design 进度对话框

java - 转换pdf java中的布局

android - 任何人都可以在 android 中使用 9-patch 设置此图像吗

java - 如何在 Horizo​​ntalScrollView 中使用自定义 View ?

java - 怎么把开关调到中央

digital-signature - Android 应用程序的 "./META-INF/CERT.RSA"文件中包含什么?

java - 使用 robotium 在 ListView 中单击图像时可扩展 ListView 滚动