Android:ImageButton 在为其分配侦听器时导致崩溃

Android: ImageButton causes crash upon assigning it a listener

所以,基本上,我有一个名为 boutonPortail 的 ImageButton,另一个名为 logo。初始化 boutonPortail 工作正常,但是当我用 boutonPortail.setOnClickListener(boutonPortailListener); 为它分配它的侦听器时,应用程序崩溃了,我根本不知道为什么。这不是听众的问题,因为当我将它分配给 logo 它工作得很好。我怀疑 XML 有问题,因为我 copy/pasted logo.

的代码

我的应用程序提示输入密码,如果密码正确,它会切换到具有 logoboutonPortail 的另一个视图。注意密码提示视图还有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.pnghttp://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