1

私はアンドロイドの初心者で、別のクラスからメソッドを呼び出す際に問題が発生しています。このメソッドは、独自のクラス内から呼び出すと正常に動作しますが、別のクラスから呼び出すと 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)
4

3 に答える 3

1

2 つのクラスが2 つの別個の Activityである場合、2 番目のアクティビティが実行されているときに 1 番目のアクティビティが停止 (終了) されるため、Null Pointer Exception が発生します -> これは Android OS のメカニズムであり、変更できません。

あなたの場合の解決策:

  • (1) アクティビティ 1 は他のアクティビティの親です。このケースは、Application クラスまたは TabHost (複雑) に適しています。

  • (2) @Zapl の answer のような静的メソッドを作成します。しかし、この静的メソッドはクラス 1 内ではなく一般的に使用する必要があるため、まだあまり良くありません。

これはユーティリティクラスです:

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*/");

また

GlobalUtil.startUrlActivity(getBaseContext().getApplicationContext(), "your_url");
于 2012-09-07T01:43:26.487 に答える
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;

      }
}
于 2012-09-07T01:13:14.697 に答える
-1

自分で作成することはできませんActivitystatic別のActivityクラスのメソッドを使用できます。

任意のアクティビティから:

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);
    }
}
于 2012-09-07T01:23:17.147 に答える