0

私はここで私の機知に富んでいます。OnClickListenerアプリケーションのボタンで同じアクションが必要な場合を実装するクラスがあります。これは以前はうまく機能していました。しかし、アプリの設定から必要なデータを取得して機能を追加したためです。startActivitynull ポインター例外をスローします。
クラスは次のとおりです。

//Imports
public class CallClickListener extends Activity implements View.OnClickListener {

    protected AppPreferences appPrefs;
    String contactPersonName;
    String contactPersonTelephone;
    String name;

    public CallClickListener(Context context){
        Log.d("TRACE", "init CallClick");
        appPrefs = new AppPreferences(context);

        try {

            JSONObject object = appPrefs.getConsultantObject();

            contactPersonName = object.getString("contactPersonName");
            contactPersonTelephone = object.getString("contactPersonTelephone");
            name = object.getString("name");

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View view) {
        final View v = view;

        AlertDialog.Builder alert = new AlertDialog.Builder(view.getContext());
        alert.setTitle("Anrufen");
        alert.setMessage("Kontakt für " + name + ", " + contactPersonName + " anrufen");
        alert.setPositiveButton("Anrufen", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:"+contactPersonTelephone));
                startActivity(callIntent);// this line throws the exception
            }
        });
        alert.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(v.getContext(), "Abbruch", Toast.LENGTH_SHORT).show();
            }
        });
        alert.show();
    }
}

文字列はすべてappPrefsからのものです。念のため、電話番号をハードコーディングしてみました。アラートは正常に機能しますが、正のボタンを押すとすぐにアプリがクラッシュ
します。次のようにリスナーを追加します。

bCall.setOnClickListener(new CallClickListener(getApplicationContext()));

必要な通話権限を追加しました。

私はAndroid開発にかなり慣れていませんが、何が欠けていますか?

4

2 に答える 2

1

これを行います....コンストラクターで渡したコンテキストオブジェクトをフィールド変数にします。startActivity を に変更しcontext.startActivityます。それはうまくいきます。

編集:完全なソリューションを強調表示します。

bCall.setOnClickListener(new CallClickListener(getApplicationContext()));

YourActivityClass.thisの代わりに変更する必要がgetApplicationContextあります。

ではないコンテキスト オブジェクトでは、同じタスク内のアクティビティの開始は機能しませんActivity。そのため、コンテキストを変更するかActivity、新しいタスクでアクティビティを開始する必要があります。また、コンストラクターに提供されたコンテキストで startActivity を呼び出さないと、コンテキストCallClickListernerがないため、NPE を取得していました。

于 2013-05-25T09:30:42.433 に答える
1

アクティビティ コンテキストを使用します。また、bCall を初期化したかどうかも確認してください。そうでない場合は、NullPointerException が発生します。

     bCall.setOnClickListener(ActivityName.this);

また、このリンクをチェックして、アクティビティ コンテキストを使用するタイミングとアプリケーション コンテキストを使用するタイミングを確認してください。

アクティビティ コンテキストまたはアプリケーション コンテキストをいつ呼び出すか?

編集:

マニフェスト ファイルにアクセス許可が追加されていることを確認してください

     <uses-permission android:name="android.permission.CALL_PHONE" />

参考までに、以下をご利用ください。私のクラスはアクティビティを拡張します

   Button b= (Button) findViewById(R.id.button1); 
   b.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v1) {
            // TODO Auto-generated method stub
              final View v = v1;

                AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());
                alert.setTitle("Anrufen");
                alert.setMessage("Kontakt für " );
                alert.setPositiveButton("Anrufen", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Intent callIntent = new Intent(Intent.ACTION_CALL);
                        callIntent.setData(Uri.parse("tel:8095992052"));
                        startActivity(callIntent);// this line throws the exception
                    }
                });
                alert.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(v.getContext(), "Abbruch", Toast.LENGTH_SHORT).show();
                    }
                });
                alert.show();
        }

    });
于 2013-05-25T09:10:49.023 に答える