无法从MainActivity调用方法

时间:2018-04-12 16:27:42

标签: java android android-studio

基本上我需要调用一个方法,该方法刷新NavigationBar中的用户名。我尝试从另一个活动SettingsActivity.java中调用它,用户更改了他的名字。

SettingsActivity.java:

// ...
MainActivity tempActivity = new MainActivity();
tempActivity.refreshNBName();
// ...

当我这样做时,我得到了这个例外:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

我试图用另一种方式做到这一点:

((MainActivity)getApplicationContext()).refreshNBName();

但这引发了另一个例外:

java.lang.ClassCastException: com.justnothing.nisser.debbie.GlobalVariables cannot be cast to com.justnothing.nisser.debbie.MainActivity

我试图在这里打电话的方法如下:

public void refreshNBName(){
    NavigationView nV = (NavigationView) findViewById(R.id.nav_view);
    View headerView = nV.getHeaderView(0);
    TextView local_user = (TextView) headerView.findViewById(R.id.actualUser);

    local_user.setText(((GlobalVariables) getApplication()).name + " " + ((GlobalVariables) getApplication()).surname);
}

我该怎么办?任何帮助或建议表示赞赏!

2 个答案:

答案 0 :(得分:0)

您写的不适用。

MainActivity tempActivity = new MainActivity();
tempActivity.refreshNBName();

因为这是创建MainActivity类的新实例。不是指MainActivity的实时实例。

你尝试了另一件事,你甚至不能这样做。

((MainActivity)getApplicationContext()).refreshNBName();

因为 getApplicationContext会返回application 类的上下文,而不是MainActivity。

我已经解决了你的问题,你不需要从另一个活动中调用任何方法。如果要更新导航抽屉。您可以在refreshNBName()的{​​{3}}上致电MainActivity.class。 因此,每次用户返回MainActivity时,导航视图都会自动更新。

答案 1 :(得分:-1)

您可以在MainActivity中创建静态方法,然后调用类似MainActivity.someMethod()的方法,但我不建议这样做!它可能导致内存泄漏和许多异常处理

如果您的主要活动未处于活动状态且处于暂停,停止,存在状态,则无需刷新主活动中的视图,并且当活动状态更改为通过覆盖onResume而恢复活动时,您始终可以将视图刷新为最新数据活动中的方法。

最后我认为与激活和片段进行通信的最佳方式是使用回调获取更多信息,请参阅此链接:

https://developer.android.com/training/basics/fragments/communicating.html