2016-01-27 4 views
1

Итак, в основном у меня есть ImageButton с именем boutonPortail, а другой - logo. Инициализация boutonPortail работает нормально, но когда я назначаю его слушателю с boutonPortail.setOnClickListener(boutonPortailListener);, приложение падает, и я не знаю, почему вообще. Это не проблема с слушателем, поскольку, когда я назначаю его logo, он работает нормально. Я сомневаюсь, что это проблема с XML, поскольку я копирую/вставляю код logo.Android: ImageButton вызывает сбой при назначении слушателя

Мое приложение запрашивает пароль, и если пароль правильный, он переключается на другой вид с помощью logo и boutonPortail. Обратите внимание, что в окне просмотра пароля также есть logo.

Проблема в том, что boutonPortail нет на главном экране? Я попытался назначить слушателя после переключения представлений, но он по-прежнему падает.

EDIT: После того, как кнопка была на главном экране, проблема в том, что кнопка не находится в главном окне, когда я помещаю ее в основной режим, она отлично работает. Почему он падает?

Также по какой-то причине я не могу изменить изображение кнопки с 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() вручную, так как у вас нет доступа к устройству Bluetooth, использовать):

MainActivity.javahttp://pastebin.com/ZXDahPZ6 activity_main.xmlhttp://pastebin.com/f14cVBKj activity_readytopress.xmlhttp://pastebin.com/0iZm91eq boutonouvrir.pnghttp://puu.sh/mLGeU.png ouvertureencours.pnghttp://puu.sh/mLGfI.png boutonfermer.pnghttp://puu.sh/mLGe5.png fermetureencours.pnghttp://puu.sh/mLGgW.png

Спасибо :)

+1

трассировки стека, пожалуйста? –

+0

Кроме того, просто разместите соответствующий код здесь, у вас нет ссылок. –

+0

У меня нет доступа к трассировке стека, так как я тестирую его на своем телефоне:/также для соответствующего кода. Я не знаю, что положить, кроме кода для инициализации, и слушателя, но я обновил его. – Zezombye

ответ

2

У вас нет кнопки с идентификатором boutonPortail в activity_main.xml

Это происходит сбой с Exception Null Pointer. Вы не можете добавить слушателя к нулевому объекту.

Вот ваш соответствующий код:

@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() возвратит нуль, поскольку acitivty_main.xml не имеет вид идентификатора этого значения. Итак, теперь boutonPortail имеет значение null.

Тогда вы называете boutonPortail.setOnClickListener(boutonPortailListener), который будет врезаться с Exception Null Pointer, поскольку boutonPortail является нулевым

+0

Да, но у меня есть это в activity_readytopress.xml. Если я добавлю его в activity_main.xml, он отобразится в этом представлении, чего я не хочу. – Zezombye

+1

@ Zezombye: вы установили видимость кнопки, чтобы исчезнуть, тогда, когда это необходимо, установите то же самое на видимое –

+0

Да, я думаю, что я сделаю это, просто установив поле невидимым, а кнопка - на видимую, а не на изменение вида. Тем не менее, странно, что он падает. Благодаря :) – Zezombye

Смежные вопросы