0

我的智慧到此为止。我有一个实现OnClickListener我的应用程序的按钮上的相同操作的类。这曾经工作得很好。但是因为我通过从应用程序偏好中获取一些需要的数据来添加一些功能。startActivity抛出空指针异常。
这是课程:

//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

使用活动上下文。还要检查你是否初始化了 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 回答
1

这样做....将您在构造函数中传递的上下文对象变成字段变量。并将 startActivity 更改为context.startActivity. 届时它将起作用。

编辑:突出显示完整的解决方案。

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

应改为 YourActivityClass.this而不是getApplicationContext

在同一任务中启动 Activity 不适用于不是Activity. 因此,您需要将上下文更改为Activity或在新任务中启动活动。同样,如果没有在提供给构造函数的上下文上调用 startActivity,您将获得 NPE,因为您CallClickListerner没有上下文。

于 2013-05-25T09:30:42.433 回答