4

ボタンに表示されるテキストをJavaファイルから変更しようとしていますが、うまくいきません。さまざまなフォーラムでしばらく検索し、Google検索を行った後、新しいボタンを作成してからbutton.setTextを使用する方法を学びました。しかし、アプリケーションが突然終了し、強制終了についてのメッセージが表示された後、デバッグを行うことにしました。問題はこのJavaクラスにあることがわかりました。

package com.KenanDeHart.thebasics;

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



public class Showrole extends Activity {
    public static int players;
    public static int idx;
    public static int[] playArray;
    public static Button nextplayerButton =null;

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

            Bundle extras = getIntent().getExtras();
            Showrole.players = extras.getInt("PLAYERS");


            for (idx = 0; idx < players ; ++idx){

                display(idx);
                ++idx;
            }


        }








     public void display(int idx){
        Bundle extras = getIntent().getExtras();
        playArray = extras.getIntArray("PLAYARRAY");
        nextplayerButton = (Button) findViewById(R.id.nextplayer);
        nextplayerButton.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
        nextplayerButton.setText(playArray[Showrole.idx]);
        }
        });
    }

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




    public void next(){

        Bundle extras = getIntent().getExtras();
        Button  button = (Button)findViewById(R.id.nextplayer);
        button.setText("Next Player");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }



    }
}

ブレークポイントを使用した後、問題のあるソースコードを見つけたと思います。

 public void display(int idx){
    Bundle extras = getIntent().getExtras();
    playArray = extras.getIntArray("PLAYARRAY");
    nextplayerButton = (Button) findViewById(R.id.nextplayer);
    nextplayerButton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
    nextplayerButton.setText(playArray[Showrole.idx]);
    }
    });
}

より具体的には、この行

nextplayerButton.setText(playArray[Showrole.idx]);

[続行]を押すと、一連のことが起こります。

  1. と呼ばれるファイルが開きます

    ZygoteInit $ MethodAndArgsCaller.run()

  2. 私の電話は一度振動します
  3. 約3秒経過
  4. 私の電話は3回速く振動します
  5. プログラムは終了します
これが私のlogcatログです

11-30 12:47:28.770: E/AndroidRuntime(9770): FATAL EXCEPTION: main
11-30 12:47:28.770: E/AndroidRuntime(9770): java.lang.NullPointerException
11-30 12:47:28.770: E/AndroidRuntime(9770):     at com.KenanDeHart.thebasics.Showrole$1.onClick(Showrole.java:51)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at android.view.View.performClick(View.java:2461)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at android.view.View$PerformClick.run(View.java:8888)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at android.os.Handler.handleCallback(Handler.java:587)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at android.os.Looper.loop(Looper.java:123)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at java.lang.reflect.Method.invokeNative(Native Method)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at java.lang.reflect.Method.invoke(Method.java:521)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-30 12:47:28.770: E/AndroidRuntime(9770):     at dalvik.system.NativeStart.main(Native Method)

このエラーに注意してください

11-30 12:47:28.770: E/AndroidRuntime(9770):     at com.KenanDeHart.thebasics.Showrole$1.onClick(Showrole.java:51)

ここで何が起こっているのか本当にわかりません。Javaを使用するのはこれが初めてで、使用してから2日しか経っていません。この質問が十分に説明的であることを願っています。私は調査を行ったが、役に立たなかったことを保証します。私は誰かが私に与えることができるどんな助けにも本当に感謝しています。ありがとうございました。

4

4 に答える 4

1

ボタンに表示されるテキストを変更するだけの場合。

これをインスタンス変数として追加します(すべてのメソッドの外)

Button nextplayerButton =null;

onCreate()メソッドでボタンの参照を取得します。

nextplayerButton = (Button) findViewById(R.id.nextplayer);
nextplayerButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
nextplayerButton.setText(""+i);
}
});
于 2012-11-30T06:46:00.503 に答える
1

LogCatによると、42行目のdisplay()メソッドにNullpointerExceptionがあります。

原因:java.lang.NullPointerException 11-30 06:44:37.147:E / AndroidRuntime(6601):com.KenanDeHart.thebasics.Showrole.display(Showrole.java:42)

そこに初期化されていないものがあるかどうかを確認してください。

于 2012-11-30T15:19:17.607 に答える
0

さて、私は何が起こっているのか理解しました。

配列「playArray」が他のインテントから正しく渡されていませんでした。変数ツリーを調べたところ、実際にはnullに等しいことがわかりました。エリアのサイズ(前のクラスで決定された変数)を意図して送信し、到着後に配列を作成することで、これを解決しました。

みなさん、ありがとうございました。StackOverflowのサポートと有用性に感銘を受けました。

于 2012-12-01T01:51:56.177 に答える
0

通常、これは機能するはずです。

setContentView(R.layout.activity_mail_sender);
        int i = 2;
        btn = (Button) findViewById(R.id.autoSendBtn);
        btn.setText(""+i);

ボタンがすでにxmlファイルにある場合は、Javaコードでボタンを作成する必要はありません。他の問題があるはずです。logcatエラーを投稿してください

于 2012-11-30T06:30:45.347 に答える