我在哪里可以放置我的EditTexts,以便他们停止给我一个nullpointer异常错误?

时间:2016-05-03 14:00:01

标签: android nullpointerexception android-edittext

我的项目中没有任何错误,但是当我运行它时,它立即关闭,给出了这些行的nullpointer异常错误:

EditText nameofcontact = (EditText) findViewById(R.id.edittextname);
EditText numberofcontact = (EditText) findViewById(R.id.edittextname);

我想我明白了这个错误发生的原因 - 在它们存在之前就提到了Edittexts,但是当我把它们放在onCreate中时,我的代码仍然不起作用。 (它在我的createbutton中给出了我的nameofcontact和numberofcontact变量的问题)。

有什么想法吗?我应该把这些行放在哪里,以便我的项目能够正常运行或者我应该添加什么代码?谢谢你的帮助。

package com.example.chris.addnewcontact;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

public String contactname;
public String contactnumber;

//the lines below are giving me null pointer exception error.

EditText nameofcontact = (EditText) findViewById(R.id.edittextname);
EditText numberofcontact = (EditText) findViewById(R.id.edittextname);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button add = (Button) findViewById(R.id.createButton);


}

public void createButton(View view) {

contactname = nameofcontact.getText().toString();
contactnumber = numberofcontact.getText().toString();

Log.d("test","yes, button is working");
ArrayList<ContentProviderOperation> contentProviderOperations = new ArrayList<ContentProviderOperation>();
//insert raw contact using RawContacts.CONTENT_URI
contentProviderOperations.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());
//insert contact display name using Data.CONTENT_URI
contentProviderOperations.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,nameofcontact ).build());
//insert mobile number using Data.CONTENT_URI
contentProviderOperations.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, numberofcontact).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).build());
try {
//apply the changes
getApplicationContext().getContentResolver().
applyBatch(ContactsContract.AUTHORITY, contentProviderOperations);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
}

5 个答案:

答案 0 :(得分:2)

这是正确的方法:

 EditText nameofcontact;
    EditText numberofcontact;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button add = (Button) findViewById(R.id.createButton);
nameofcontact = (EditText) findViewById(R.id.edittextname);
numberofcontact = (EditText) findViewById(R.id.edittextname);

}

当onCreate调用时,您可以初始化您的视图。方法视图外部无法初始化,因为它们无法找到上下文。

答案 1 :(得分:1)

在移动EditText初始化代码的位置已经建议了正确的答案。具体来说,您可以将代码更改为以下内容(复制并粘贴,测试并告知我们是否有效): package com.example.chris.addnewcontact;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

public String contactname;
public String contactnumber;

//the lines below are giving me null pointer exception error.

EditText nameofcontact ;
EditText numberofcontact;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

 Button add = (Button) findViewById(R.id.createButton);
 nameofcontact = (EditText) findViewById(R.id.edittextname);
 numberofcontact = (EditText) findViewById(R.id.edittextname);

}

public void createButton(View view) {

contactname = nameofcontact.getText().toString();
contactnumber = numberofcontact.getText().toString();

Log.d("test","yes, button is working");
ArrayList<ContentProviderOperation> contentProviderOperations = new ArrayList<ContentProviderOperation>();
//insert raw contact using RawContacts.CONTENT_URI
contentProviderOperations.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());
//insert contact display name using Data.CONTENT_URI
contentProviderOperations.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,nameofcontact ).build());
//insert mobile number using Data.CONTENT_URI
contentProviderOperations.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, numberofcontact).withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).build());
try {
   //apply the changes
   getApplicationContext().getContentResolver().
   applyBatch(ContactsContract.AUTHORITY, contentProviderOperations);
} catch (RemoteException e) {
   e.printStackTrace();
} catch (OperationApplicationException e) {
   e.printStackTrace();
}
}

答案 2 :(得分:0)

onCreate之后的最佳位置是setContentView(R.layout.activity_main);,因为这是您添加观看次数的地方。添加它们后,您可以查找它们。

在您的课程中添加findViewById本身会尝试在创建活动时查找它们 - 此时它是空的,这就是您的编辑文字仍为null的原因。

答案 3 :(得分:0)

在您的活动的onCreate()方法中。 但是你可以在活动开始时声明变量。

答案 4 :(得分:0)

看起来你的编辑文本字段的实例化并没有像它应该的那样在onCreate方法中发生。如果你希望它们保持全局,那么将那些EditText的声明保留在方法之外,但是将这些对象的瞬时移动到onCreate方法的主体中。

此外,使用xml文件中的2个不同的EditText项进行实例化。