2011-06-26 87 views
1

我有我加载一个观点,我的onCreate()方法是这样的:为什么button.setOnClickListener会使我的应用程序崩溃?

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按钮,代码...

感谢

回答

6

要回答你的问题:

你需要调用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.空间之前和类型转换括号(例如,“(Button)”) 3.正确缩进 4.没有多余的空行之后的每个= 2.空间(例如后,@覆盖公共无效的onClick 5.有益的意见

这是小事情,让你的代码更易于阅读其他程序员。

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

+0

非常感谢您的帮助!并辅导最佳编码技术。我想我有一种混乱的坏习惯。你的解决方案肯定会让应用程序停止崩溃,不幸的是,toast消息仍然不会触发,并且onclick事件中的断点也不会触发,但希望我能够解决这个问题... –

+0

I再次编辑我的示例代码。我认为你的上下文可能是错误的,你应该使用'getApplicationContext()'而不是'Verse.this',但是如果断点不工作,我不知道发生了什么。 – ianonavy

相关问题