4

我正在尝试从我的 java 文件中更改按钮上显示的文本,但运气不佳。在各种论坛上搜索了一段时间,并进行了谷歌搜索后,我学会了创建一个新按钮,然后使用 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. 我的手机快速振动了三下
  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,我才用了两天。我希望这个问题足够解释,我向你保证我已经完成了我的研究,但无济于事。我非常感谢有人可以给我的任何帮助。谢谢你。

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): at com.KenanDeHart.thebasics.Showrole.display(Showrole.java:42)

只需检查那里是否有未初始化的东西。

于 2012-11-30T15:19:17.607 回答
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 回答
0

好吧,我知道发生了什么。

我的其他意图未正确传递数组“playArray”。我查看了变量树,发现它实际上等于 null。我通过发送带有意图的区域大小(这是在上一课中确定的变量)并在到达后创建数组来解决这个问题。

感谢大家的帮助。Stack Overflow 上的支持和帮助给我留下了深刻的印象。

于 2012-12-01T01:51:56.177 回答