运行时错误,通过启动应用程序

时间:2017-09-20 23:34:20

标签: android exception

我在Android Studio中编写了一个小应用程序。如果我在模拟器中启动应用程序,那么我会得到一个例外。该应用程序只是停止。

源代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private int points, round, countdown;
    private static final int FROG_ID = 212121;
    private Random rnd = new Random();
    private Handler handler = new Handler();


    private Runnable runnable = new Runnable(){
        @Override
        public void run(){
            countdown();
        }
    };

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


    private void newGame(){
        points = 0;
        round = 1;
        initRound();
    }

    private void initRound(){
        countdown = 10;
        ViewGroup container = (ViewGroup) findViewById(R.id.container);
        container.removeAllViews();
        WimmelView wv = new WimmelView(this);
        container.addView(wv, ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        wv.setImageCount(5*(10+round));
        ImageView frog = new ImageView(this);
        frog.setId(FROG_ID);
        frog.setImageResource(R.drawable.frog1);
        frog.setScaleType(ImageView.ScaleType.CENTER);
        float scale = getResources().getDisplayMetrics().density;
        FrameLayout.LayoutParams lp= new FrameLayout.LayoutParams(Math.round(64*scale),Math.round(61*scale));
        lp.leftMargin = rnd.nextInt(container.getWidth()-64);
        lp.topMargin = rnd.nextInt(container.getHeight()-61);
        lp.gravity = Gravity.TOP + Gravity.START;
        frog.setOnClickListener(this);
        container.addView(frog, lp);
        handler.postDelayed(runnable, 1000-round*50);
        update();

    }

    private void fillTextView(int id, String text){
        TextView tv = (TextView) findViewById(id);
        tv.setText(text);
    }

    private void update(){
        fillTextView(R.id.points, Integer.toString(points));
        fillTextView(R.id.round, Integer.toString(round));
        fillTextView(R.id.countdown,
                Integer.toString(countdown*1000));
    }

    private void showStartFragment(){
        ViewGroup container = (ViewGroup) findViewById(R.id.container);
        container.removeAllViews();
        container.addView(
                getLayoutInflater().
                        inflate(R.layout.fragment_start, null));
        container.findViewById(R.id.start).setOnClickListener(this);
    }

    private void showGameOverFragment(){
        ViewGroup container = (ViewGroup) findViewById(R.id.container);
        container.addView(
                getLayoutInflater().
                        inflate(R.layout.fragment_gameover, null));
        container.findViewById(play_again).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if(view.getId()==R.id.start){
            startGame();
        }else if(view.getId()==R.id.play_again){
            showStartFragment();
        }else if(view.getId()==FROG_ID){
            handler.removeCallbacks(runnable);
            Toast.makeText(this,R.string.kissed, Toast.LENGTH_SHORT).show();
            //showToast(R.string.kissed);
            points += countdown*1000;
            round++;
        }
        initRound();
    }


    private void startGame() {
        newGame();
    }

    private void countdown(){
        countdown--;
        update();
        if(countdown<=0){
            //frog.setOnClickListener(null);
            showGameOverFragment();
        }else {
            handler.postDelayed(runnable, 1000-round*50);
        }
    }

    @Override
    protected  void onPause(){
        super.onPause();
        handler.removeCallbacks(runnable);
    }
}

一开始我到目前为止,我至少可以按下开始,现在我在应用程序纯粹... 我曾尝试过googlen它可能是什么,但我没有成功。我还在frog.setId(FROG_ID)点上收到错误消息。

另外,我还有另一个实现图像的类

public class WimmelView extends View {

    private Random rnd;
    private long randomSeed = 1;
    private int imageCount;
    private Paint paint = new Paint();


    private static  final int[]
            images = { R.drawable.frog2,
                      R.drawable.frog3,R.drawable.frog4,
                      R.drawable.frog5,R.drawable.frog6};

    public void setImageCount(int imageCount){
        this.imageCount = imageCount;
        randomSeed = System.currentTimeMillis();
        invalidate();
    }

    public WimmelView(Context context){
        super(context);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        rnd = new Random(randomSeed);
        for(int image:images){
            Bitmap bitmap =
                    BitmapFactory.decodeResource(getResources(),image);
            for(int i=0; i<imageCount/images.length; i++){
                float left = (float) (rnd.nextFloat()
                        *(getWidth()-bitmap.getWidth()));
                float top = (float) (rnd.nextFloat()
                        *(getWidth()-bitmap.getWidth()));
                canvas.drawBitmap(bitmap,left,top,paint);
            }
            bitmap.recycle();
        }
}
}

我希望有人看到错误,可以帮助我...

3 个答案:

答案 0 :(得分:0)

您的错误是内容视图正在从屏幕中删除所有子项,包括您尝试使用的得分和点的文本视图。我刚刚帮助你离线移动片段并确保你很好。古德勒克。

答案 1 :(得分:0)

你可以使用它,

<item name="frog_id" type="id"/>

这给你独特的价值。 您可以在ids.xml中添加它。并更改您的代码

...
frog.setId(R.id.frog_id);
...
else if(view.getId()==R.id.frog_id)

试试这个

答案 2 :(得分:0)

这与设置视图ID有关。您无法使用以下内容设置ID:

private static final int FROG_ID = 212121;

...
frog.setId(FROG_ID);

您需要在res/values/ids.xml中定义ID:

<?xml version="1.0" encoding="utf-8"?>

<resources>   
   <item name="your_view_id" type="id"/>     
</resources>

但是 会出现创建动态视图的目的

相反,您可以使用View.generateViewId作为ID。但请记住,此方法仅适用于API版本17.此处摘录:

  

int generateViewId()

     

生成适合在setId(int)中使用的值。这个值不会   与由aapt为R.id。

在构建时生成的ID值冲突