Android:ImageButton 在为其分配侦听器时导致崩溃
Android: ImageButton causes crash upon assigning it a listener
所以,基本上,我有一个名为 boutonPortail
的 ImageButton,另一个名为 logo
。初始化 boutonPortail
工作正常,但是当我用 boutonPortail.setOnClickListener(boutonPortailListener);
为它分配它的侦听器时,应用程序崩溃了,我根本不知道为什么。这不是听众的问题,因为当我将它分配给 logo
它工作得很好。我怀疑 XML 有问题,因为我 copy/pasted logo
.
的代码
我的应用程序提示输入密码,如果密码正确,它会切换到具有 logo
和 boutonPortail
的另一个视图。注意密码提示视图还有logo
.
是boutonPortail
不在主视图的问题吗?我尝试在切换视图后分配监听器,但它仍然崩溃。
编辑:将按钮放入主视图后,问题肯定是按钮不在主视图中,当我将它放入主视图时它工作正常。为什么它会崩溃?
此外,由于某些原因,我无法使用 boutonPortail.setImageResource(R.drawable.boutonfermer);
更改按钮的图像。 (在主视图中不会发生这种情况)
onCreate 方法:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
logo = (ImageButton)findViewById(R.id.logo);
boutonPortail = (ImageButton)findViewById(R.id.boutonPortail);
codeEntered = (EditText)findViewById(R.id.codeEntered);
codeSurNotice = (TextView)findViewById(R.id.codeSurNotice);
//attribute all listeners
logo.setOnClickListener(boutonPortailListener);
codeEntered.addTextChangedListener(textWatcher);
codeEntered.setOnKeyListener(codeEnteredListener);
改变视图的方法:
void codeCorrect() {
setContentView(R.layout.activity_readytopress);
boutonPortail.setOnClickListener(boutonPortailListener); //this line crashes the app, even if put in the onCreate
}
听众:
private OnClickListener boutonPortailListener = new OnClickListener() {
@Override
public void onClick(View v) {
boutonState++;
if(boutonState>=4)
boutonState=0;
boutonPortail.setImageResource(R.drawable.boutonfermer);
}
};
XML:
<ImageButton
android:id="@+id/boutonPortail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="40dip"
android:src="@drawable/boutonouvrir"
android:background="#00000000"
style="#00000000"
android:layout_gravity="center"
/>
如果你想测试它,这是我的完整代码(请注意,你必须手动调用 codeCorrect()
方法,因为你无法访问我使用的蓝牙设备):
MainActivity.java
http://pastebin.com/ZXDahPZ6
activity_main.xml
http://pastebin.com/f14cVBKj
activity_readytopress.xml
http://pastebin.com/0iZm91eq
boutonouvrir.png
http://puu.sh/mLGeU.png
ouvertureencours.png
http://puu.sh/mLGfI.png
boutonfermer.png
http://puu.sh/mLGe5.png
fermetureencours.png
http://puu.sh/mLGgW.png
谢谢:)
您在 activity_main.xml
中没有 ID 为 boutonPortail
的按钮
它因空指针异常而崩溃。
您不能将侦听器添加到空对象。
这是您的相关代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// On récupère toutes les vues dont on a besoin
logo = (ImageButton)findViewById(R.id.logo);
boutonPortail = (ImageButton)findViewById(R.id.boutonPortail);
所以你调用 setContentView(R.layout.activity_main)
然后你调用 findViewById(R.id.boutonPortail)
findContentView()
将 return 为空,因为 acitivty_main.xml
没有该值的视图 ID。所以现在 boutonPortail
为空。
然后你调用 boutonPortail.setOnClickListener(boutonPortailListener)
这将因空指针异常而崩溃,因为 boutonPortail
为 null
所以,基本上,我有一个名为 boutonPortail
的 ImageButton,另一个名为 logo
。初始化 boutonPortail
工作正常,但是当我用 boutonPortail.setOnClickListener(boutonPortailListener);
为它分配它的侦听器时,应用程序崩溃了,我根本不知道为什么。这不是听众的问题,因为当我将它分配给 logo
它工作得很好。我怀疑 XML 有问题,因为我 copy/pasted logo
.
我的应用程序提示输入密码,如果密码正确,它会切换到具有 logo
和 boutonPortail
的另一个视图。注意密码提示视图还有logo
.
是boutonPortail
不在主视图的问题吗?我尝试在切换视图后分配监听器,但它仍然崩溃。
编辑:将按钮放入主视图后,问题肯定是按钮不在主视图中,当我将它放入主视图时它工作正常。为什么它会崩溃?
此外,由于某些原因,我无法使用 boutonPortail.setImageResource(R.drawable.boutonfermer);
更改按钮的图像。 (在主视图中不会发生这种情况)
onCreate 方法:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
logo = (ImageButton)findViewById(R.id.logo);
boutonPortail = (ImageButton)findViewById(R.id.boutonPortail);
codeEntered = (EditText)findViewById(R.id.codeEntered);
codeSurNotice = (TextView)findViewById(R.id.codeSurNotice);
//attribute all listeners
logo.setOnClickListener(boutonPortailListener);
codeEntered.addTextChangedListener(textWatcher);
codeEntered.setOnKeyListener(codeEnteredListener);
改变视图的方法:
void codeCorrect() {
setContentView(R.layout.activity_readytopress);
boutonPortail.setOnClickListener(boutonPortailListener); //this line crashes the app, even if put in the onCreate
}
听众:
private OnClickListener boutonPortailListener = new OnClickListener() {
@Override
public void onClick(View v) {
boutonState++;
if(boutonState>=4)
boutonState=0;
boutonPortail.setImageResource(R.drawable.boutonfermer);
}
};
XML:
<ImageButton
android:id="@+id/boutonPortail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="40dip"
android:src="@drawable/boutonouvrir"
android:background="#00000000"
style="#00000000"
android:layout_gravity="center"
/>
如果你想测试它,这是我的完整代码(请注意,你必须手动调用 codeCorrect()
方法,因为你无法访问我使用的蓝牙设备):
MainActivity.java
http://pastebin.com/ZXDahPZ6
activity_main.xml
http://pastebin.com/f14cVBKj
activity_readytopress.xml
http://pastebin.com/0iZm91eq
boutonouvrir.png
http://puu.sh/mLGeU.png
ouvertureencours.png
http://puu.sh/mLGfI.png
boutonfermer.png
http://puu.sh/mLGe5.png
fermetureencours.png
http://puu.sh/mLGgW.png
谢谢:)
您在 activity_main.xml
boutonPortail
的按钮
它因空指针异常而崩溃。 您不能将侦听器添加到空对象。
这是您的相关代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// On récupère toutes les vues dont on a besoin
logo = (ImageButton)findViewById(R.id.logo);
boutonPortail = (ImageButton)findViewById(R.id.boutonPortail);
所以你调用 setContentView(R.layout.activity_main)
然后你调用 findViewById(R.id.boutonPortail)
findContentView()
将 return 为空,因为 acitivty_main.xml
没有该值的视图 ID。所以现在 boutonPortail
为空。
然后你调用 boutonPortail.setOnClickListener(boutonPortailListener)
这将因空指针异常而崩溃,因为 boutonPortail
为 null