0

やあ。Android用の電卓アプリを作ってみました。2 つのボタンを表示して、そのうちの 1 つをクリックするとテキスト ボックスに表示されるようにコーディングしようとしました。

コードは次のとおりです。

package com.test.cal;

android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class CalculatorActivity extends Activity implements OnClickListener {
    EditText ans;
    Button b1,b2;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        ans = (EditText) findViewById(R.id.ans);
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch(arg0.getId())
        {
        case R.id.one:
                ans.setText(1);
            break;
        case R.id.two:
                ans.setText(2);
            break;
        default:Toast.makeText(this, "fuckoff", 1000);
            break;  
        }
     }
   }

ヌル ポイントの例外をクリックすると、次の場所に移動します。

b2=(Button) findViewById(R.id.two); 

ライン。助けてください。私は初心者です。スタック オーバーフローを検索しましたが、それに関連するいくつかの回答がわかりませんでした。

4

4 に答える 4

4

実際には、前にビューを定義 (アクセス) しようとしているため、すべてのビューはnullです。setContentView(R.layout.main);

コード行を変更するだけで、

@Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ans = (EditText) findViewById(R.id.ans);
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);

    }

置く

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

main.xmlファイルで定義されたビューにアクセスする前に..

于 2012-08-27T10:32:22.880 に答える
2

oncreate を変更してください。このように書く

@Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ans = (EditText) findViewById(R.id.ans);
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);

    }
于 2012-08-27T10:35:41.930 に答える
1

電話

setContentView(R.layout.main); 

ボタンにアクセスしてテキストを編集する前に

public void onCreate(Bundle savedInstanceState) {

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

        ans = (EditText) findViewById(R.id.ans);
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
    }
于 2012-08-27T10:34:43.600 に答える
1

コードの下に置く

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

定義されたビューにアクセスする前 (ボタンと編集テキストの初期化) 。

setContentView(R.layout.main); の後に以下のコードを追加することが重要です。そうしないと、例外が発生し、アプリケーションがクラッシュします。この理由は、この呼び出しの前に UI が存在しないため、View を取得する前に findViewById() を使用できないためです。

ans = (EditText) findViewById(R.id.ans);
b1=(Button) findViewById(R.id.one);
b2=(Button) findViewById(R.id.two);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
于 2012-08-27T10:33:46.713 に答える