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

时间:2011-06-26 01:36:31

标签: android debugging 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();

        }});
     }

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

值得注意的是,如果没有在我的视图中添加代码的按钮,视图就可以正常加载,并且按钮会显示在它们应该的位置。

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

由于

1 个答案:

答案 0 :(得分: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();
        }
    });
}

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

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

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

相关问题