NullPointerException при запуске деятельности - PullRequest
0 голосов
/ 22 ноября 2011

Это мои коды ниже. Я пытаюсь использовать намерение вызвать другое действие в моем пакете «Зарегистрироваться» в этом действии «PictureTakeActivity». У меня есть еще одна кнопка в этом упражнении, которая использует намерение вызвать камеру. Программа всегда останавливается, когда я пытаюсь вызвать Register.class, нажав кнопку «GotoRegister». Я добавил активность "Регистрация" в манифест.

в DDMS:

Невозможно создать экземпляр активности ComponentInfo {Picture.Capture / Picture.Capture.Register}: java.lang.NullPointerException

11-21 20:39:08.057: E/AndroidRuntime(539): FATAL EXCEPTION: main
11-21 20:39:08.057: E/AndroidRuntime(539): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{Picture.Capture/Picture.Capture.Register}: java.lang.NullPointerException
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1879)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.os.Looper.loop(Looper.java:137)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.ActivityThread.main(ActivityThread.java:4340)
11-21 20:39:08.057: E/AndroidRuntime(539):  at java.lang.reflect.Method.invokeNative(Native Method)
11-21 20:39:08.057: E/AndroidRuntime(539):  at java.lang.reflect.Method.invoke(Method.java:511)
11-21 20:39:08.057: E/AndroidRuntime(539):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-21 20:39:08.057: E/AndroidRuntime(539):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-21 20:39:08.057: E/AndroidRuntime(539):  at dalvik.system.NativeStart.main(Native Method)
11-21 20:39:08.057: E/AndroidRuntime(539): Caused by: java.lang.NullPointerException
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.Activity.findViewById(Activity.java:1794)
11-21 20:39:08.057: E/AndroidRuntime(539):  at Picture.Capture.Register.<init>(Register.java:31)
11-21 20:39:08.057: E/AndroidRuntime(539):  at java.lang.Class.newInstanceImpl(Native Method)
11-21 20:39:08.057: E/AndroidRuntime(539):  at java.lang.Class.newInstance(Class.java:1319)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1870)
11-21 20:39:08.057: E/AndroidRuntime(539):  ... 11 more

Может кто-нибудь помочь мне найти проблему?

Я новичок в Android. Как мы можем эффективно отлаживать программы Android при использовании эмулятора Android? Большое спасибо.

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);    
    final Button cameraButton = (Button)findViewById(R.id.camera_button); 
    // Get a handle to the button so we can add a handler for the click event 
    cameraButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v){
              String iString = Integer.toString(i+100);
              Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              File file = new File("/sdcard",iString);
              outputFileUri = Uri.fromFile(file);
              intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
              startActivityForResult(intent, TAKE_PICTURE);
              i++;
           }// This will cause the onActivityResult event to fire once it's done

        });

    //Call Register.java

    Button GotoRegister = (Button) findViewById(R.id.GotoRegister);

}

public void registerhandler(View view)
{
    Intent GoRegister = new Intent(PictureTakeActivity.this,Register.class);
          startActivity(GoRegister);
    Toast toast = Toast.makeText(this, "Hello!", Toast.LENGTH_LONG);
    toast.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
 if (requestCode == TAKE_PICTURE) 
  {`

    Uri imageUri = null;

    // Check if the result includes a thumbnail Bitmap
    if (data != null)
    {
      if (data.hasExtra("data")) 
      {
        thumbnail = data.getParcelableExtra("data");
        // TODO Do something with the thumbnail
        SlidingDrawer mysliding= (SlidingDrawer) findViewById(R.id.drawer);
        ImageView myimage= (ImageView) findViewById(R.id.content);
        myimage.setImageBitmap(thumbnail);
        myimage.showContextMenu();
        mysliding.open(); 
      }

    //Problem!!!! This Bitmap does not have any function!
     else {
     // TODO Do something with the full image stored
     // in outputFileUri
        SlidingDrawer mysliding= (SlidingDrawer) findViewById(R.id.drawer);
        ImageView myimage= (ImageView) findViewById(R.id.content);
        myimage.setImageURI(outputFileUri);
        mysliding.open();
        }
     }
  }
}

Класс регистрации:

public class Register extends Activity
{
public
TextView RegisterName= (TextView)findViewById(R.id.RegisterName);   
final int PICTURE_ACTIVITY = 1; 



private static int TAKE_PICTURE = 1;
@Override

public void onCreate(Bundle savedInstanceState)
{

    Bitmap bit=Picture.Capture.PictureTakeActivity.thumbnail;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.register_layout);
    RegisterName.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v){

            RegisterName.clearComposingText();
        }


    });

    ImageView Registerimage= (ImageView)findViewById(R.id.RegisterPicture);

    // Relply intent from PictureTakeAcitivity and go Back

    Button GoBack=(Button)findViewById(R.id.GoBack);
    GoBack.setOnClickListener(new View.OnClickListener() {
      public void onClick(View view) {
            Intent replyIntent = new Intent();
            setResult(RESULT_OK, replyIntent);
            finish();
            AddEntry();
        }
    }

    );


}


private void AddEntry()
{
    final Button RegisterButton=(Button)findViewById(R.id.RegisterButton);
    RegisterButton.setOnClickListener
    (new OnClickListener()
     {
        @Override
        public void onClick(View v)
        {
              String EntryName=(String) RegisterName.getText();
              Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              File file = new File(getFilesDir(),EntryName);
              Uri registryFileUri = Uri.fromFile(file);
              intent.putExtra(MediaStore.EXTRA_OUTPUT, registryFileUri);
              startActivityForResult(intent,TAKE_PICTURE);         
        }           
    }
    );

}

}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2011
TextView RegisterName= (TextView)findViewById(R.id.RegisterName); 

Не удается найти текстовое представление до того, как вы загрузили макет, поместите его после:

setContentView(R.layout.register_layout);
0 голосов
/ 22 ноября 2011

Есть ваша проблема.Вы не создаете экземпляр чего-либо в строке 31 Register.java.

11-21 20:39:08.057: E/AndroidRuntime(539): Caused by: java.lang.NullPointerException
11-21 20:39:08.057: E/AndroidRuntime(539):  at android.app.Activity.findViewById(Activity.java:1794)
11-21 20:39:08.057: E/AndroidRuntime(539):  at Picture.Capture.Register.<init>(Register.java:31)

В противном случае код, который вы используете для вызова второй операции, верен.

 Intent goRegister = new Intent (PictureTakeActivity.this, Register.class);
 startActivity(goRegister);

Вы уже сказаличто Register Активность добавлена ​​в ваш файл манифеста.

Редактировать:

public TextView RegisterName= (TextView)findViewById(R.id.RegisterName);

это объявление должно идти внутри вашего onCreate() метода, сразу после:

super.onCreate(savedInstanceState);
setContentView(R.layout.register_layout);

Вы должны загрузить макет, прежде чем пытаться получить доступ к элементам из него.

Это всегда должны быть ваши первые две строки в вашем методе onCreate().Это означает, что тоже переместите эту строку:

  Bitmap bit=Picture.Capture.PictureTakeActivity.thumbnail;

Наконец, ваш код должен выглядеть следующим образом:

public class Register extends Activity {

final int PICTURE_ACTIVITY = 1; 
private static int TAKE_PICTURE = 1;
public TextView RegisterName;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.register_layout);

    Bitmap bit=Picture.Capture.PictureTakeActivity.thumbnail;

    RegisterName = (TextView)findViewById(R.id.RegisterName);  

    RegisterName.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v){

            RegisterName.clearComposingText();
        }


    });
// etc..
...