Ho 调用来自另一个 activity 的 toast 消息
Ho to call own toast message from another activity
我定义了自己的方法来显示 Toast,我想从另一个 Activity 调用它。当我这样做时,我的应用程序崩溃了。你有一些Attempt to invoke virtual method.... on a null object reference
。
Toast 方法:
public void showToastDown(Context context, String message) {
context = getApplicationContext();
inflater = getLayoutInflater();
View v = inflater.inflate(R.layout.toast_down, (ViewGroup) findViewById(R.id.toast_down_root));
TextView tvToastDown = v.findViewById(R.id.tvToastDown);
tvToastDown.setText(message);
Toast toast = new Toast(context);
toast.setGravity(Gravity.BOTTOM|Gravity.FILL_HORIZONTAL, 0,0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(v);
toast.show();
}
和第 2 个 activity 的代码:
switch (item.getItemId()){
case R.id.btnAddActionBar:
MainActivity mainActivity= new MainActivity();
mainActivity.showToastDown(this, "TEXT");
break;
}
return super.onOptionsItemSelected(item);
}
从您的代码中删除这一行,因为您已经在传递上下文的值,因此无需使用应用程序上下文再次初始化。
context = getApplicationContext();
编辑:像这样改变你的方法:
public void showToastDown(Context context, String message) {
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
View v = inflater.inflate(R.layout.toast_down, (ViewGroup) ((Activity)context).findViewById(R.id.toast_down_root));
TextView tvToastDown = v.findViewById(R.id.tvToastDown);
tvToastDown.setText(message);
Toast toast = new Toast(context);
toast.setGravity(Gravity.BOTTOM|Gravity.FILL_HORIZONTAL, 0,0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(v);
toast.show();
}
您的代码有几个问题:
永远不要自己实例化活动 (mainActivity = new MainActivity
)。这不起作用,只有 Android OS 可以创建活动。我建议在线学习一些(免费的)初学者 android 教程,以了解活动的运作方式及其作用。
您编写的 toast 函数是一个实用函数,似乎与 MainActivity
没有任何关系。如果你把它作为一个不同 class 的静态函数(其目的只是提供像这样有用的实用函数),例如ActivityTools.java
,然后你可以从任何地方调用它并像你一样传递一个 Context。
在您的 toast 函数中,您收到一个上下文作为第一个参数,但随后立即覆盖它。这没有任何意义,没有理由这样覆盖它。
我定义了自己的方法来显示 Toast,我想从另一个 Activity 调用它。当我这样做时,我的应用程序崩溃了。你有一些Attempt to invoke virtual method.... on a null object reference
。
Toast 方法:
public void showToastDown(Context context, String message) {
context = getApplicationContext();
inflater = getLayoutInflater();
View v = inflater.inflate(R.layout.toast_down, (ViewGroup) findViewById(R.id.toast_down_root));
TextView tvToastDown = v.findViewById(R.id.tvToastDown);
tvToastDown.setText(message);
Toast toast = new Toast(context);
toast.setGravity(Gravity.BOTTOM|Gravity.FILL_HORIZONTAL, 0,0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(v);
toast.show();
}
和第 2 个 activity 的代码:
switch (item.getItemId()){
case R.id.btnAddActionBar:
MainActivity mainActivity= new MainActivity();
mainActivity.showToastDown(this, "TEXT");
break;
}
return super.onOptionsItemSelected(item);
}
从您的代码中删除这一行,因为您已经在传递上下文的值,因此无需使用应用程序上下文再次初始化。
context = getApplicationContext();
编辑:像这样改变你的方法:
public void showToastDown(Context context, String message) {
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
View v = inflater.inflate(R.layout.toast_down, (ViewGroup) ((Activity)context).findViewById(R.id.toast_down_root));
TextView tvToastDown = v.findViewById(R.id.tvToastDown);
tvToastDown.setText(message);
Toast toast = new Toast(context);
toast.setGravity(Gravity.BOTTOM|Gravity.FILL_HORIZONTAL, 0,0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(v);
toast.show();
}
您的代码有几个问题:
永远不要自己实例化活动 (
mainActivity = new MainActivity
)。这不起作用,只有 Android OS 可以创建活动。我建议在线学习一些(免费的)初学者 android 教程,以了解活动的运作方式及其作用。您编写的 toast 函数是一个实用函数,似乎与
MainActivity
没有任何关系。如果你把它作为一个不同 class 的静态函数(其目的只是提供像这样有用的实用函数),例如ActivityTools.java
,然后你可以从任何地方调用它并像你一样传递一个 Context。在您的 toast 函数中,您收到一个上下文作为第一个参数,但随后立即覆盖它。这没有任何意义,没有理由这样覆盖它。