0

ボタンをクリックすると NullpointerException エラーが発生します。logcat は、エラーが 62 行目にあることを示しています

String Titre = Title.getText().toString();

EditTexts が初期化されていないためだと思います。それが initFields() メソッドを作成した理由ですが、呼び出す場所がどこでも NullPointerException も取得するため、どこで呼び出すかはまだわかりません

ここに私のコードがあります:

public class MainActivity extends Activity implements
android.view.View.OnClickListener{

private EditText Title, Description, Coordonnees, Tel, mail;
private Bitmap photo;
private ImageView imageView;
//private PhotoPicker photoPicker;
private static final int SELECT_PICTURE = 1;
private String selectedImagePath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Title = (EditText) findViewById(R.id.titre);
    Description = (EditText) findViewById(R.id.Description);
    imageView = (ImageView) findViewById(R.id.images);
    Coordonnees = (EditText) findViewById(R.id.Coordonnees);
    Tel = (EditText) findViewById(R.id.tel);
    mail = (EditText) findViewById(R.id.Mail);

    setContentView(R.layout.activity_main);
    //initFields();
    ((Button)this.findViewById(R.id.bouton1)).setOnClickListener(this);
    ((ImageView)this.findViewById(R.id.images)).setOnClickListener(this);



}

@Override
public void onClick(View v) {

    switch (v.getId()) {

    case R.id.images:
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
        break;
    case R.id.bouton1:
        String Titre = Title.getText().toString();
        String Desc = Description.getText().toString();
        String Coord = Coordonnees.getText().toString();
        String tel = Tel.getText().toString();
        String Mailtxt = mail.getText().toString();

        boolean trueMail = Pattern
        .compile("^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$",
                Pattern.CASE_INSENSITIVE).matcher(Mailtxt)
                .matches();
        boolean trueTel = Pattern.matches("^[+]?[0-9]{3,}$", tel);

        if (imageView == null || !trueMail || !trueTel || Titre.equals("")
                || Desc.equals("") || Coord.equals("")){
            Toast.makeText(this, R.string.missing_field, Toast.LENGTH_SHORT).show();
        }
        break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            imageView = (ImageView) findViewById(R.id.images);
            imageView.setImageDrawable(getResources().getDrawable(
                    R.drawable.register_photo));
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            System.out.println("Image Path : " + selectedImagePath);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize=16; //image will be 16x smaller than an original. Note, that it's better for perfomanse to use powers of 2 (2,4,8,16,32..).
            Bitmap bmp = BitmapFactory.decodeFile(selectedImagePath, options); 
            Drawable d = new BitmapDrawable(bmp);

            imageView.setImageDrawable(d);
        }
    }

}

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
private void initFields() {
    Title.setText("");
    Description.setText("");
    Coordonnees.setText("");
    Tel.setText("");
    mail.setText("");
}

}

4

4 に答える 4

2

要素を見つける前に、レイアウトをインフレートする必要があります。

 super.onCreate(savedInstanceState);    
 setContentView(R.layout.activity_main); <-- move this line here
 Title = (EditText) findViewById(R.id.titre);
 /**/
  //initFields();

ドキュメントから:

ほとんどすべてのアクティビティはユーザーとやり取りするため、ActivityUI を配置できるウィンドウの作成はクラスが処理します。setContentView(View)

/**/

onCreate(Bundle)アクティビティを初期化する場所です。最も重要なことは、ここでは通常setContentView(int)、UI を定義するレイアウト リソースを呼び出しfindViewById(int)、プログラムで操作する必要があるその UI 内のウィジェットを取得するために使用することです。

于 2013-10-28T13:01:22.940 に答える
2

以下を試してください

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Title = (EditText) findViewById(R.id.titre);
    ... // rest of the code  

最初にレイアウトをインフレートしてから、ビューを初期化する必要があります。findViewById現在のインフレートされたレイアウトでビューを探します。したがって、最初にレイアウトのコンテンツをアクティビティに設定してから、ビューを初期化する必要があります。

以下のようにすでに imageView を初期化しているので、再度初期化する必要はありません

  imageView = (ImageView) findViewById(R.id.images);

なのでこれを交換

  ((ImageView)this.findViewById(R.id.images)).setOnClickListener(this);

  imageView.setOnClickListener(this);
于 2013-10-28T13:02:03.670 に答える
2

setContentViewビューを初期化する前に使用する必要があります。

常にsetContentViewキープsuper.onCreate(savedInstanceState);

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


    Title = (EditText) findViewById(R.id.titre);
    Description = (EditText) findViewById(R.id.Description);
    imageView = (ImageView) findViewById(R.id.images);
    Coordonnees = (EditText) findViewById(R.id.Coordonnees);
    Tel = (EditText) findViewById(R.id.tel);
    mail = (EditText) findViewById(R.id.Mail);
于 2013-10-28T13:03:06.313 に答える