我是Android的菜鸟,我在调用另一个类的方法时遇到问题。从它自己的类中调用时,该方法的工作正常,但是当我从另一个类调用它时,我得到一个nullpointerexception。任何帮助将不胜感激。这是我的代码;
从class2调用class1中的方法:
BottlesActivity inst = new BottlesActivity();
inst.call0();
第1类中的方法:
public void call0() {
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:1234567890"/*+phonenumber0*/));
startActivity(callIntent); //<--This line causes nullpointerexception
} catch (ActivityNotFoundException activityException) {
Log.e("dialing-example", "Call failed", activityException);
}
}
这是我的Logcat
09-06 20:51:33.237: E/AndroidRuntime(18192): java.lang.NullPointerException
09-06 20:51:33.237: E/AndroidRuntime(18192): at android.app.Activity.startActivityForResult(Activity.java:2893)
09-06 20:51:33.237: E/AndroidRuntime(18192): at android.app.Activity.startActivity(Activity.java:3003)
09-06 20:51:33.237: E/AndroidRuntime(18192): at com.bryanjrichardson.GSCC.BottlesActivity.call0(GoldandSilverCoinCalculatorActivity.java:857)
09-06 20:51:33.237: E/AndroidRuntime(18192): at com.bryanjrichardson.GSCC.SimpleItemizedOverlay$1.onClick(SimpleItemizedOverlay.java:204)
09-06 20:51:33.237: E/AndroidRuntime(18192): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:174)
09-06 20:51:33.237: E/AndroidRuntime(18192): at android.os.Handler.dispatchMessage(Handler.java:99)
09-06 20:51:33.237: E/AndroidRuntime(18192): at android.os.Looper.loop(Looper.java:130)
09-06 20:51:33.237: E/AndroidRuntime(18192): at android.app.ActivityThread.main(ActivityThread.java:3859)
09-06 20:51:33.237: E/AndroidRuntime(18192): at java.lang.reflect.Method.invokeNative(Native Method)
09-06 20:51:33.237: E/AndroidRuntime(18192): at java.lang.reflect.Method.invoke(Method.java:507)
09-06 20:51:33.237: E/AndroidRuntime(18192): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-06 20:51:33.237: E/AndroidRuntime(18192): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-06 20:51:33.237: E/AndroidRuntime(18192): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1)
如果您的2个类是 2个单独的活动,您的情况将导致空指针异常,因为当第2个活动正在运行时,第一个活动停止(终止) - &gt;这是Android OS机制,你无法改变。
您案件的解决方案:
(1)活动1是其他人的父级,这种情况适用于Application类或TabHost(复杂)。
(2)创建静态方法,如 @ Zapl的答案;但它仍然不太好,因为这种静态方法应该是常用的而不是在Class 1中 - &gt;修改:创建一个公共类,如下所示:
这是实用程序类:
public class GlobalUtil
{
public static void startUrlActivity(Context context, String url) {
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse(url));
context.startActivity(callIntent); //<-- pass current activity or context
} catch (ActivityNotFoundException activityException) {
Log.e("dialing-example", "Call failed", activityException);
}
}
}
在任何其他活动课程中,你可以称之为:
GlobalUtil.startUrlActivity(this, "tel:1234567890"/*+phonenumber0*/");
OR
GlobalUtil.startUrlActivity(getBaseContext().getApplicationContext(), "your_url");
答案 1 :(得分:0)
如果call0()是同一个活动类的方法,这将有效。
public void call0() {
try {
Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:1234567890"));
startActivity(callIntent);
} catch (ActivityNotFoundException activityException) {
Log.e("dialing-example", "Call failed", activityException);
}
}
并且不要忘记在清单文件中添加它:
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
我认为这不是一件好事:
BottlesActivity inst = new BottlesActivity();
inst.call0();
相反,单击该按钮时,请调用call0(),如下所示:
public void onClick(View v) {
switch(v.getId()){
case R.id.idButton:
call0();
break;
}
}
答案 2 :(得分:-1)
您无法自己创建Activity
。您可以在另一个Activity类中使用static
方法。
来自任何活动:
BottlesActivity.call0(this);
BottlesActivity中的
public static void call0(Context context) {
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:1234567890"/*+phonenumber0*/));
context.startActivity(callIntent); //<--This line causes nullpointerexception
} catch (ActivityNotFoundException activityException) {
Log.e("dialing-example", "Call failed", activityException);
}
}