簡體   English   中英

當我按下按鈕時應用程序崩潰

[英]App crashes when i press the button

當我按下“讓我們開始玩”按鈕時,我的應用程序就會崩潰。 我剛開始開發..它甚至不是產生錯誤的文本,我只是嘗試做 tv1.setText("test"); 它也崩潰了。

這是我的代碼:

    package com.example.adam.casinoadam;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class Main extends Activity {

    ImageView iv1;
    ImageView iv2;
    ImageView iv3;
    TextView tv1;
    Button btn1;
    int x,y,z;
    int coins=15;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        iv1 = (ImageView) findViewById(R.id.iv1);
        iv2 = (ImageView) findViewById(R.id.iv2);
        iv3 = (ImageView) findViewById(R.id.iv3);
        tv1 = (TextView) findViewById(R.id.tv1);
        btn1 = (Button) findViewById(R.id.btn1);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }



    public void Start(View view) {
        if(coins==0) {
            Toast.makeText(this, "Sorry. Good Bye!", Toast.LENGTH_LONG).show();
            finish();
        }

        coins=coins-1;
        tv1.setText("Money: "+coins+" Coins");


        x=1+(int)((5-1+1)*Math.random());
        y=1+(int)((5-1+1)*Math.random());
        z=1+(int)((5-1+1)*Math.random());


        if(x==1)iv1.setImageResource(R.drawable.cherry);
        if(x==2)iv1.setImageResource(R.drawable.tiltan);
        if(x==3)iv1.setImageResource(R.drawable.bell);


        if(y==1)iv2.setImageResource(R.drawable.cherry);
        if(y==1)iv2.setImageResource(R.drawable.tiltan);
        if(y==1)iv2.setImageResource(R.drawable.bell);


        if(z==1)iv3.setImageResource(R.drawable.cherry);
        if(z==1)iv3.setImageResource(R.drawable.tiltan);
        if(z==1)iv3.setImageResource(R.drawable.bell);


        if(x==y && y==z && z==x){
            Toast.makeText(this,"You won !",Toast.LENGTH_LONG).show();
            coins=coins+10;
}
}
}

將您的 onCreate 替換為以下代碼:

@Override
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv1 = (ImageView) findViewById(R.id.iv1);
    iv2 = (ImageView) findViewById(R.id.iv2);
    iv3 = (ImageView) findViewById(R.id.iv3);
    tv1 = (TextView) findViewById(R.id.tv1);
    btn1 = (Button) findViewById(R.id.btn1);1
}

如果您在setContentView()提供的布局中存在, findViewById()將返回一個 View ,否則返回null ,這就是發生在您身上的事情。

如果你setContentView(R.layout.activity_main); 然后調用findViewById(R.id.iv1); 它將返回一個視圖,這是您的布局,但是如果您調用findViewById(R.id.iv1); setContentView(R.layout.activity_main);之前setContentView(R.layout.activity_main); 它將返回null因為您的活動沒有附加視圖。

在 onCreate 方法中調用 setContentView 之前,您無法初始化視圖對象。 如果您初始化視圖對象,它將獲得空值,因為活動沒有獲得它的布局文件。

iv1 = (ImageView) findViewById(R.id.iv1);
iv2 = (ImageView) findViewById(R.id.iv2);
iv3 = (ImageView) findViewById(R.id.iv3);
tv1 = (TextView) findViewById(R.id.tv1);
btn1 = (Button) findViewById(R.id.btn1);

這 5 行必須在 onCreate 方法中的這兩行之后:

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

所以,你的代碼必須是:

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv1 = (ImageView) findViewById(R.id.iv1);
    iv2 = (ImageView) findViewById(R.id.iv2);
    iv3 = (ImageView) findViewById(R.id.iv3);
    tv1 = (TextView) findViewById(R.id.tv1);
    btn1 = (Button) findViewById(R.id.btn1);
}

像這樣修改你的代碼:

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

        iv1 = (ImageView) findViewById(R.id.iv1);
        iv2 = (ImageView) findViewById(R.id.iv2);
        iv3 = (ImageView) findViewById(R.id.iv3);
        tv1 = (TextView) findViewById(R.id.tv1);
        btn1 = (Button) findViewById(R.id.btn1);
    }

findViewById必須在setContentView之后

您必須在setContentView(R.layout.activity_main);之后定義視圖setContentView(R.layout.activity_main);

用這個onCreate()替換你的代碼首先你必須setContentView(R.layout.activity_main)才能投射你的Button等等。

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

所以最后你的代碼看起來像這樣。

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

    iv1 = (ImageView) findViewById(R.id.iv1);
    iv2 = (ImageView) findViewById(R.id.iv2);
    iv3 = (ImageView) findViewById(R.id.iv3);
    tv1 = (TextView) findViewById(R.id.tv1);
    btn1 = (Button) findViewById(R.id.btn1);
}

您必須嘗試這樣做,因為在contentview定義布局之前,您不能在程序中使用 ( findviewbyid ) 函數

  @Override

 protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv1 = (ImageView) findViewById(R.id.iv1);
    iv2 = (ImageView) findViewById(R.id.iv2);
    iv3 = (ImageView) findViewById(R.id.iv3);
    tv1 = (TextView) findViewById(R.id.tv1);
    btn1 = (Button) findViewById(R.id.btn1);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM