开始使用新的意向活动。 NPE在android.content.ContextWrapper.getPackageName [英] Starting new Activity using Intent. NPE at android.content.ContextWrapper.getPackageName

查看:350
本文介绍了开始使用新的意向活动。 NPE在android.content.ContextWrapper.getPackageName的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用意图来开始新的活动。我在不同的应用程序成功地做到了这一点,但这种做法似乎并不在这种情况下工作?

这是我的code ...

 公共无效startLevelEnd(上下文的背景下){
     意图myIntent =新意图(FirstActivity.this,LevelEndPanel.class);
     FirstActivity.this.startActivity(myIntent);
 }

从我的Andr​​oidManifest.xml 文件...

 <活动机器人:标签=@字符串/ APP_NAME机器人:名字=。LevelEndPanel>< /活性GT;

使用

和我称之为 startLevelEnd()程序(fromout不同的类)...

  FirstActivity.startLevelEnd(本);

我得到就行了 NullPointerException异常错误意图myIntent ......(由code上面的代码片段):

  9月4日至16日:46:39.361:E / AndroidRuntime(475):在android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)

完整的日志:

  04-16 14:32:32.870:E / AndroidRuntime(336):致命异常:主要
04-16 14:32:32.870:E / AndroidRuntime(336):显示java.lang.NullPointerException
04-16 14:32:32.870:E / AndroidRuntime(336):在android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
04-16 14:32:32.870:E / AndroidRuntime(336):在android.content.ComponentName<&初始化GT;(ComponentName.java:75)
04-16 14:32:32.870:E / AndroidRuntime(336):在android.content.Intent<&初始化GT;(Intent.java:2702)
04-16 14:32:32.870:E / AndroidRuntime(336):在happyworx.nl.App.FirstActivity.startLevelEnd(FirstActivity.java:32)
04-16 14:32:32.870:E / AndroidRuntime(336):在happyworx.nl.App.model.components.GameManager.LevelEnd(GameManager.java:89)
04-16 14:32:32.870:E / AndroidRuntime(336):在happyworx.nl.App.model.components.GameManager $ 1.run(GameManager.java:60)
04-16 14:32:32.870:E / AndroidRuntime(336):在android.os.Handler.handleCallback(Handler.java:587)
04-16 14:32:32.870:E / AndroidRuntime(336):在android.os.Handler.dispatchMessage(Handler.java:92)
04-16 14:32:32.870:E / AndroidRuntime(336):在android.os.Looper.loop(Looper.java:123)
04-16 14:32:32.870:E / AndroidRuntime(336):在android.app.ActivityThread.main(ActivityThread.java:3683)
04-16 14:32:32.870:E / AndroidRuntime(336):在java.lang.reflect.Method.invokeNative(本机方法)
04-16 14:32:32.870:E / AndroidRuntime(336):在java.lang.reflect.Method.invoke(Method.java:507)
04-16 14:32:32.870:E / AndroidRuntime(336):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
04-16 14:32:32.870:E / AndroidRuntime(336):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-16 14:32:32.870:E / AndroidRuntime(336):在dalvik.system.NativeStart.main(本机方法)

有关@Sergi,包含此方法的满级:

 包happyworx.nl.Appelz.model.components;
进口happyworx.nl.Appelz.AppelzActivity;
进口happyworx.nl.Appelz.LevelEndPanel;
进口happyworx.nl.Appelz.MainGamePanel;
进口happyworx.nl.Appelz.MainThread;
进口happyworx.nl.Appelz.R;
进口happyworx.nl.Appelz.model.apple;
进口happyworx.nl.Appelz.model.glyphs;
进口的java.util.ArrayList;
进口java.util.Collections中;
进口java.util.HashSet中;
进口的java.util.List;
进口java.util.Set中;进口android.app.Activity;
进口android.content.Intent;
进口android.graphics.BitmapFactory;
进口android.graphics.Canvas;
进口android.os.Handler;
进口android.util.Log;
公共类游戏管理延伸活动{    //声明瓦尔
    私有静态最后弦乐TAG =游戏管理;
    公共静态MainGamePanel面板;
    私有静态字形glyphsCount;
    公共静态游戏管理游戏管理=新游戏管理();    公共静态AppelzActivity AppelzActivity =新AppelzActivity();    私有静态帆布油画;
    最终静态INT delayMillis = 1000;
    公共静态布尔数= FALSE;
    公共静态INT I = 6;
    公众最终静态处理程序处理程序=新的处理程序();
    公众最终静态Runnable接口可运行=新的Runnable(){        @覆盖
        公共无效的run()
        {            如果(SlotManager.alSlottedFruitList.size()大于0){
            // TODO创建全屏倒计时
                Log.d(,倒数计时器在游戏管理+ I);                一世 - ;
                如果(计数和放大器;&安培; I> -1)//停止定时器计数时,为假
                {
                    handler.postDelayed(可运行,1000);
                }其他{
                    如果(我== -1){
                        Log.d(,综合报道水平);                        GameManager.LevelEnd();
                    }
                    //重新设置倒计时(如果外面结账篮子)
                    我= 6;
                }
            }其他{
                //重新设置倒计时(如果插槽没有水果)
                我= 6;
            }
        }
    };
    公共无效LevelEnd(){
        //首先,算上插槽的水果
        SlotManager.countSlotInv();
        清单<整数GT;名单=新的ArrayList<整数GT;();
        //填写itemIds同类型的水果
        对于(苹果:SlotManager.alSlottedFruitList){
            整型的itemId = Integer.valueOf(a.FruitType);
            list.add(的itemId);            SET<整数GT;独特=新的HashSet<整数GT;(名单);
        }
            对于(INT键= 0;键3;;重点++){
                的System.out.println(键+:+ Collections.frequency(名单,关键));
            }
            startLevelEnd();
    }    公共无效startLevelEnd(){
         意图myIntent =新意图(这一点,LevelEndPanel.class);
         this.startActivity(myIntent);
     }    公共游戏管理()
    {
    }

该LevelEndPanel类:

 包happyworx.nl.Appelz;
进口android.app.Activity;
进口android.content.Intent;
进口android.os.Bundle;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;公共类LevelEndPanel扩展活动实现OnClickListener { 私有静态最后弦乐TAG = LevelEndPanel.class.getSimpleName();
 私人按钮btnNewMission; 公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.level);        btnNewMission =(按钮)findViewById(R.id.btnNewMission);
        btnNewMission.setOnClickListener(新Button.OnClickListener(){
            公共无效的onClick(查看为arg0){
                意图I =新意图(getApplicationContext(),AppelzActivity.class);
                startActivity(ⅰ);
            }});
 }
@覆盖
公共无效的onClick(视图v){
    // TODO自动生成方法存根}}

而MainThread:

 包happyworx.nl.Appelz;进口android.graphics.Canvas;
进口android.util.Log;
进口android.view.SurfaceHolder;公共类MainThread继承Thread { 私有静态最后弦乐TAG = MainThread.class.getSimpleName(); 私人SurfaceHolder surfaceHolder;
 私人MainGamePanel的GamePanel;
 公共静态布尔运行;
 公共静态帆布油画; 公共无效setRunning(布尔运行){
 MainThread.running =运行;
 } 公共MainThread(SurfaceHolder surfaceHolder,MainGamePanel的GamePanel){
  超();
  this.surfaceHolder = surfaceHolder;
  this.gamePanel =的GamePanel; } @覆盖
 公共无效的run(){
     //帆布油画;
      Log.d(TAG启动游戏循环);
      而(运行){
      MainThread.canvas = NULL;
       //尝试锁定独家像素编辑画布表面上
       尝试{
           MainThread.canvas = this.surfaceHolder.lockCanvas();
        同步(surfaceHolder){
         //更新游戏状态
         this.gamePanel.update();
         //渲染状态屏幕
         //绘制面板上的画布
         this.gamePanel.onDraw(MainThread.canvas);
        }
       } {最后
        //在异常的情况下,表面不留下
        //不一致状态
        如果(MainThread.canvas!= NULL){
         surfaceHolder.unlockCanvasAndPost(MainThread.canvas);
        }
       } //最后结束
      }
     }
}

和篮下类,它开始在游戏管理倒数计时器(也许这是我的错误?!?)

 包happyworx.nl.Appelz.model;进口happyworx.nl.Appelz.MainGamePanel;
进口happyworx.nl.Appelz.model.components.GameManager;
进口happyworx.nl.Appelz.model.components.SlotManager;
进口android.graphics.Bitmap;
进口android.graphics.Canvas;
进口android.util.Log;
进口android.view.MotionEvent;公共类篮{ 私人位图位图; //实际的位图
 私人诠释X; // X坐标
 私人诠释Ÿ; // Y坐标
 公共静态INT宽度;
 公共静态INT高度;
 公众持股量X = 100;
 公众持股量Y = 100; 私人布尔感动; //如果机器人被触摸/拾起 公共篮(位图位图,诠释的x,int y)对{
  this.bitmap =位图;  宽度= bitmap.getWidth();
  高度= bitmap.getHeight();
 } 公共位图getBitmap(){
  返回位图;
 }
 公共无效setBitmap(位图位图){
  this.bitmap =位图;
 } 公众诠释的getWidth(){
      返回bitmap.getWidth();
     }     公众诠释的getHeight(){
      返回bitmap.getHeight();
     } 公众诠释的getX(){
  返回X;
 } 公共无效setX的(浮X){    //如果篮子比slotmargin进一步
     如果(X +宽/ 2 - ; SlotManager.SlotmarginX){
        //如果篮子是不是在收银区域
         如果(this.Y< MainGamePanel.height - 80 - 身高/ 2){
            X = SlotManager.SlotmarginX - 宽/ 2;        }其他{
            //如果篮子中的检出
            X = MainGamePanel.width - 宽/ 2;            如果尚未运行//开始倒计时
            如果(!GameManager.count){
                GameManager.count = TRUE;
                GameManager.handler.postDelayed(GameManager.runnable,0);
            }        }
    }其他{        //篮不中的检出;停止倒计时
        GameManager.count = FALSE;
    }     this.X = X;
 }
 公众诠释的getY(){
  返回是;
 }
 公共无效塞蒂(int y)对{
        如果(Y +高度/ 2 - ; MainGamePanel.height - 80){
            Y = MainGamePanel.height - 80 - 高度/ 2;
        }
  this.Y = Y;
 }
 公共布尔isTouched(){
  返回感动;
 } 公共无效setTouched(布尔感动){
  this.touched =触及;
 } 公共无效画(油画画布){
      canvas.drawBitmap(位图,X - 宽/ 2,Y - 高度/ 2,NULL);
 } 公共无效handleActionDown(INT eventX,诠释eventY){
  如果(eventX> =(x - 宽度/ 2)及及(eventX&下; =(X +宽度/ 2))){
   如果(eventY> =(Y - 高度/ 2)及及(eventY&下; =(Y +高度/ 2))){
    //篮感动
    setTouched(真);
   }其他{
    setTouched(假);
   }
  }其他{
   setTouched(假);
  } }
}


解决方案

在这里,我敢打赌,你正试图从没有完全初始化活动开始一个活动。

请在开始另一个活动之前,请确保FirstActivity.onCreate被调用。

I'm trying to start a new Activity using an Intent. I've done this successfully in a different app, but that approach doesn't seem to work in this case?

This is my code...

 public void startLevelEnd(Context context){
     Intent myIntent = new Intent(FirstActivity.this, LevelEndPanel.class);
     FirstActivity.this.startActivity(myIntent);
 }

From my AndroidManifest.xml file...

<activity android:label="@string/app_name" android:name=".LevelEndPanel"></activity>

And I call the startLevelEnd() routine (fromout a different class) using...

FirstActivity.startLevelEnd(this);

I get a NullPointerException error on the line "Intent myIntent..." (from code snippet above) :

04-16 09:46:39.361: E/AndroidRuntime(475):  at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)

Full Log :

04-16 14:32:32.870: E/AndroidRuntime(336): FATAL EXCEPTION: main
04-16 14:32:32.870: E/AndroidRuntime(336): java.lang.NullPointerException
04-16 14:32:32.870: E/AndroidRuntime(336):  at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
04-16 14:32:32.870: E/AndroidRuntime(336):  at android.content.ComponentName.<init>(ComponentName.java:75)
04-16 14:32:32.870: E/AndroidRuntime(336):  at android.content.Intent.<init>(Intent.java:2702)
04-16 14:32:32.870: E/AndroidRuntime(336):  at happyworx.nl.App.FirstActivity.startLevelEnd(FirstActivity.java:32)
04-16 14:32:32.870: E/AndroidRuntime(336):  at happyworx.nl.App.model.components.GameManager.LevelEnd(GameManager.java:89)
04-16 14:32:32.870: E/AndroidRuntime(336):  at happyworx.nl.App.model.components.GameManager$1.run(GameManager.java:60)
04-16 14:32:32.870: E/AndroidRuntime(336):  at android.os.Handler.handleCallback(Handler.java:587)
04-16 14:32:32.870: E/AndroidRuntime(336):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-16 14:32:32.870: E/AndroidRuntime(336):  at android.os.Looper.loop(Looper.java:123)
04-16 14:32:32.870: E/AndroidRuntime(336):  at android.app.ActivityThread.main(ActivityThread.java:3683)
04-16 14:32:32.870: E/AndroidRuntime(336):  at java.lang.reflect.Method.invokeNative(Native Method)
04-16 14:32:32.870: E/AndroidRuntime(336):  at java.lang.reflect.Method.invoke(Method.java:507)
04-16 14:32:32.870: E/AndroidRuntime(336):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-16 14:32:32.870: E/AndroidRuntime(336):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-16 14:32:32.870: E/AndroidRuntime(336):  at dalvik.system.NativeStart.main(Native Method)

For @Sergi, the full class containing the method :

package happyworx.nl.Appelz.model.components;


import happyworx.nl.Appelz.AppelzActivity;
import happyworx.nl.Appelz.LevelEndPanel;
import happyworx.nl.Appelz.MainGamePanel;
import happyworx.nl.Appelz.MainThread;
import happyworx.nl.Appelz.R;
import happyworx.nl.Appelz.model.apple;
import happyworx.nl.Appelz.model.glyphs;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import android.app.Activity;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Handler;
import android.util.Log;


public class GameManager extends Activity {

    //Declare Vars
    private static final String TAG = "GameManager";
    public static MainGamePanel panel;
    private static glyphs glyphsCount;
    public static GameManager GameManager = new GameManager();

    public static AppelzActivity AppelzActivity = new AppelzActivity();

    private static Canvas canvas;
    final static int delayMillis = 1000;
    public static boolean count = false;
    public static int i = 6;
    public final static Handler handler = new Handler();


    public final static Runnable runnable = new Runnable()  {

        @Override
        public void run()
        {

            if (SlotManager.alSlottedFruitList.size() > 0){
            //TODO Create Full screen countdown timer
                Log.d("", "Countdown Timer in GameManager " + i);

                i--;
                if (count && i > -1) // stop timer when count is false
                {
                    handler.postDelayed(runnable, 1000);
                } else {
                    if (i == -1){
                        Log.d("", "RoundUp the Level");

                        GameManager.LevelEnd();
                    }
                    // reset Countdown (if basket outside checkout)
                    i = 6;
                }
            } else {
                // reset Countdown (if slot has no fruits)
                i = 6;
            }
        }
    };


    public void LevelEnd(){
        // First, count the Fruits in the slot
        SlotManager.countSlotInv();
        List<Integer> list = new ArrayList<Integer>();


        // Fill itemIds with the types of fruits
        for (apple a : SlotManager.alSlottedFruitList){
            Integer itemId = Integer.valueOf(a.FruitType);
            list.add(itemId);

            Set<Integer> unique = new HashSet<Integer>(list);
        }
            for (int key = 0; key < 3 ; key++) {
                System.out.println(key + " : " + Collections.frequency(list, key));     
            }
            startLevelEnd();
    }

    public void startLevelEnd(){
         Intent myIntent = new Intent(this, LevelEndPanel.class);
         this.startActivity(myIntent);
     }

    public GameManager() 
    {
    }

The LevelEndPanel class :

package happyworx.nl.Appelz;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;



public class LevelEndPanel extends Activity implements OnClickListener {

 private static final String TAG = LevelEndPanel.class.getSimpleName();
 private Button btnNewMission;

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.level);

        btnNewMission = (Button) findViewById(R.id.btnNewMission);
        btnNewMission.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View arg0) {
                Intent i = new Intent(getApplicationContext(), AppelzActivity.class);
                startActivity(i);
            }});


 }


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

}

}

And the MainThread :

package happyworx.nl.Appelz;

import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;

public class MainThread extends Thread {

 private static final String TAG = MainThread.class.getSimpleName();

 private SurfaceHolder surfaceHolder;
 private MainGamePanel gamePanel;
 public static boolean running;
 public static Canvas canvas;

 public void setRunning(boolean running) {
 MainThread.running = running;
 }

 public MainThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel) {
  super();
  this.surfaceHolder = surfaceHolder;
  this.gamePanel = gamePanel;

 }

 @Override
 public void run() {
     // Canvas canvas;
      Log.d(TAG, "Starting game loop");
      while (running) {
      MainThread.canvas = null;
       // try locking the canvas for exclusive pixel editing on the surface
       try {
           MainThread.canvas = this.surfaceHolder.lockCanvas();
        synchronized (surfaceHolder) {
         // update game state
         this.gamePanel.update();
         // render state to the screen
         // draws the canvas on the panel
         this.gamePanel.onDraw(MainThread.canvas);
        }
       } finally {
        // in case of an exception the surface is not left in
        // an inconsistent state
        if (MainThread.canvas != null) {
         surfaceHolder.unlockCanvasAndPost(MainThread.canvas);
        }
       } // end finally
      }
     }
}

And the basket class, which starts the CountDown timer in GameManager (maybe here is my error?!?)

package happyworx.nl.Appelz.model;

import happyworx.nl.Appelz.MainGamePanel;
import happyworx.nl.Appelz.model.components.GameManager;
import happyworx.nl.Appelz.model.components.SlotManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;
import android.view.MotionEvent;

public class basket {

 private Bitmap bitmap; // the actual bitmap
 private int x;   // the X coordinate
 private int y;   // the Y coordinate'
 public static int width;
 public static int height;
 public float X = 100;
 public float Y = 100;

 private boolean touched; // if droid is touched/picked up

 public basket(Bitmap bitmap, int x, int y) {
  this.bitmap = bitmap;

  width = bitmap.getWidth(); 
  height = bitmap.getHeight(); 
 }

 public Bitmap getBitmap() {
  return bitmap;
 }
 public void setBitmap(Bitmap bitmap) {
  this.bitmap = bitmap;
 }

 public int getWidth(){
      return bitmap.getWidth();
     }

     public int getHeight(){
      return bitmap.getHeight();
     }

 public int getX() {
  return x;
 }



 public void setX(float x) {

    // if basket is further than slotmargin 
     if (x + width/2 > SlotManager.SlotmarginX) {
        // if basket is NOT in CheckOut area    
         if (this.Y < MainGamePanel.height - 80 - height/2){
            x = SlotManager.SlotmarginX - width/2;

        } else {
            // if basket IS in CheckOut area
            x = MainGamePanel.width - width/2;

            // Start the countdown timer if not already running
            if (!GameManager.count){
                GameManager.count=true;
                GameManager.handler.postDelayed(GameManager.runnable, 0);                               
            }

        }
    } else {

        // Basket is NOT in CheckOut area; stop countdown timer
        GameManager.count=false;
    }

     this.X = x;
 }


 public int getY() {
  return y;
 }
 public void setY(int y) {
        if (y + height/2 > MainGamePanel.height - 80){
            y = MainGamePanel.height - 80 - height/2;
        }


  this.Y = y;
 }


 public boolean isTouched() {
  return touched;
 }

 public void setTouched(boolean touched) {
  this.touched = touched;
 }

 public void draw(Canvas canvas) {
      canvas.drawBitmap(bitmap, X - width/2, Y - height/2, null);
 }

 public void handleActionDown(int eventX, int eventY) {
  if (eventX >= (X - width/ 2) && (eventX <= (X + width/2))) {
   if (eventY >= (Y - height/ 2) && (eventY <= (Y + height/ 2))) {
    // basket touched
    setTouched(true);
   } else {
    setTouched(false);
   }
  } else {
   setTouched(false);
  }

 }
}

解决方案

My bet here is that you are trying to start an activity from an activity that is not fully initialized.

Make sure FirstActivity.onCreate has been called before starting another activity.

这篇关于开始使用新的意向活动。 NPE在android.content.ContextWrapper.getPackageName的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆