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

时间:2016-01-27 16:25:52

标签: java android imagebutton

所以,基本上,我有一个名为boutonPortail的ImageButton,另一个叫logo。初始化boutonPortail工作正常,但是当我为其监听器分配boutonPortail.setOnClickListener(boutonPortailListener);应用程序崩溃时,我根本不知道为什么。这对听众来说不是问题,因为当我将它分配给logo时,它的工作正常。我怀疑这是XML的问题,因为我复制/粘贴了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.png http://puu.sh/mLGgW.png

谢谢:)

1 个答案:

答案 0 :(得分:2)

boutonPortail

中没有标识为activity_main.xml的按钮

它因空指针异常而崩溃。 您无法将侦听器添加到空对象。

以下是您的相关代码:

@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()将返回null,因为acitivty_main.xml没有该值的视图ID。所以现在boutonPortail为空。

然后你调用boutonPortail.setOnClickListener(boutonPortailListener),因为boutonPortail为空

,它会因空指针异常而崩溃