为什么button.setOnClickListener会崩溃我的应用程序?

Ste*_* J. 1 debugging android onclick listener actionlistener

我有一个视图,我正在加载,我的onCreate()方法如下所示:

public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       volume_id=getIntent().getStringExtra("volume_id");
       language=getIntent().getStringExtra("language");
       chapter=Integer.parseInt(getIntent().getStringExtra("chapter"));
       book=getIntent().getStringExtra("book");
       book_id=getIntent().getStringExtra("book_id");

       final Button back=(Button)findViewById(R.id.backButton);
        back.setOnClickListener(new View.OnClickListener() {
        @Override

        public void onClick(View v) {


            //Toast.makeText(Verse.this, "Back", Toast.LENGTH_LONG).show();

        }});

     final Button next=(Button)findViewById(R.id.forwardButton);
        next.setOnClickListener(new View.OnClickListener() {
        @Override

        public void onClick(View v) {


            //Toast.makeText(Verse.this, "Next", Toast.LENGTH_LONG).show();

        }});
     }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,最后几行代码的添加,连接到我在布局文件中创建的两个按钮,正在使我的应用程序崩溃.我在错误日志中没有得到任何内容,所以我完全不知道发生了什么.

值得注意的是,如果没有在我的视图中添加代码的按钮,视图会很好地加载,并且按钮会显示在它们应该的位置.

我添加这些按钮的方式是否正常?难道我做错了什么?我希望将GUI按钮连接到代码并不是那么困难......

谢谢

ian*_*avy 7

回答你的问题:

在打电话之前,您需要打电话setContentView(R.layout.main)(或调用任何布局文件)findViewById.此外,final关键字可能会破坏您的代码,但这可能不是问题.

其他可能有用的信息:(您在技术上不需要阅读任何此类信息)

您的代码格式也非常混乱.考虑一下:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get intent information
    volume_id = getIntent().getStringExtra("volume_id");
    language = getIntent().getStringExtra("language");
    chapter = getIntent().getIntExtra("chapter")); // Changed from String to int
    book = getIntent().getStringExtra("book");
    book_id = getIntent().getStringExtra("book_id");

    // Find views by ID
    Button back = (Button) findViewById(R.id.backButton);        
    Button next = (Button) findViewById(R.id.forwardButton);

    // Click listeners
    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "Back", Toast.LENGTH_LONG).show();
        }
    });

    next.setOnClickListener(new View.OnClickListener() {        
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_LONG).show();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

注意:1.每个前后的空格= 2.类型转换括号后的空格(例如" (Button)")3.正确的缩进4.没有多余的空行(例如,在@Override和public void onClick 5之间.有用的评论

这些小东西使您的代码更容易从其他程序员那里阅读.

此外,您可能需要考虑将"chapter"作为intExtra传递,而不是从String中解析它.这浪费了宝贵的记忆.将实例字段String更改为int.最后,您可能还想考虑为整个类创建Buttons实例字段.