ButterKnife onclick не работает

Я отлично вводил представления, используя библиотеку Butterknife. Но когда я пытаюсь реализовать прослушиватели, например onclick, я не могу их реализовать. Следующий код Java поможет вам понять мою проблему.

Java-код:

public class LoginActivity extends ActionBarActivity{
    @InjectView(R.id.toolbar) Toolbar toolbar;
    @InjectView(R.id.btn_login) Button login;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        ButterKnife.inject(this);

        initialize();
        //initListeners();

        @OnClick(R.id.btn_login)
        public void submit(View view) {
          // TODO submit data to server...
        }
    }

    /*private void initListeners() {
        @OnClick(R.id.btn_login)
        public void login(){

        }
    }*/

    private void initialize() {
        setSupportActionBar(toolbar);
        getSupportActionBar().setIcon(R.drawable.toolbar_icon);
        getSupportActionBar().setTitle(null);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}

Скажи мне, почему это происходит. Что-то не так в коде? Я уже настроил IDE, совместимую с ButterKnife, используя следующий URL.

http://stackoverflow.com/questions/27754811/onclick-is-not-working-in-implementation-of-butterknife-library

Пожалуйста, дайте мне какие-либо предложения по этому вопросу. Заранее спасибо..


person malli    schedule 13.04.2015    source источник
comment
Вы можете опубликовать свой стек Track   -  person vinay Maneti    schedule 13.04.2015
comment
Поместите метод отправки вне oncreate   -  person Piotr Golinski    schedule 13.04.2015
comment
привет винай, он дает пустоту, это недопустимый тип для переменной submit   -  person malli    schedule 13.04.2015
comment
привет, пиотр, вы можете проверить это с помощью кода Butterknife github, чтобы вы могли получить больше ясности в этом.   -  person malli    schedule 13.04.2015
comment
Это ошибка, которую я получаю во время компиляции. Пожалуйста, посмотрите на нее. Несколько маркеров в этой строке - void - недопустимый тип для переменной submit - Синтаксическая ошибка на токене),; ожидаемо — синтаксическая ошибка в токене (, ; ожидаемо   -  person malli    schedule 13.04.2015


Ответы (5)


MainActivity.java

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;


public class MainActivity extends ActionBarActivity {


    @InjectView(R.id.button)
    Button login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);


    }


    @OnClick(R.id.button)
    void submitButton(View view) {
            Toast.makeText(this, "Click", Toast.LENGTH_SHORT).show();
    }
}

и часть activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="59dp"
        android:layout_marginStart="59dp"
        android:layout_marginTop="132dp"
        />
</RelativeLayout>

в файле build.gradle (приложение)

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile 'com.jakewharton:butterknife:6.1.0'
}
person vinay Maneti    schedule 13.04.2015
comment
vinay Я не реализую слушателей Android. Мне нужно сделать это с библиотекой Butterknife.. - person malli; 13.04.2015
comment
но вы внедрили обычный прослушиватель Android. Я хочу реализовать прослушиватель только с ножом для масла. Например, после @OnClick(R.id.submit) void submit() { // сервер вызова TODO... } - person malli; 13.04.2015
comment
Да, я видел, что см. следующий URL-адрес, содержащий образец масляного ножа. Я хочу, чтобы слушатели были реализованы как есть. /Джейк Уортон/масляный нож - person malli; 13.04.2015
comment
Я все еще могу использовать его даже без @OnClick, так как он связан с помощью xml: android:onClick=submitButton - person nafsaka; 01.08.2016
comment
да. Он работает без @OnClick, так как мы используем в xml-файле кнопку android:onClick=submitButton - person vinay Maneti; 01.08.2016
comment
но если вы можете использовать onClick() в xml, это не обязательно, но это неправильный ответ. - person David Hackro; 04.08.2016
comment
Хорошо, я видел, что onClick также реализован в XML, но сейчас не вижу. Вот почему я сказал это, потому что не имеет смысла реализовывать onClick в XML, а затем реализовывать его через Butterknife. Но все же в этом измененном коде вы сравниваете идентификатор представления, в этом нет необходимости, потому что вы уже предоставили идентификатор для масляного ножа в аннотации, поэтому он позаботится об этом, и только связанное представление получит событие. - person Saini Arun; 19.04.2018
comment
этот ответ отсутствует {annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'} - person abdullahicyc; 03.05.2018

В моем случае это мое решение

добавить classpath в gradle(Project)

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

и gradle(Module) добавить apply и apt

apply plugin: 'com.neenbedankt.android-apt'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'   
    compile 'com.jakewharton:butterknife:8.2.1'
    apt 'com.jakewharton:butterknife-compiler:8.2.1'
}

файл java

@OnClick(R.id.btn_login)
public void submit(View view) {
  // TODO submit data to server...
}
person David Hackro    schedule 04.08.2016

Вы должны связать oilKnife, прежде чем использовать аннотации.

Добавьте эти зависимости в gradle.build

compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

Затем добавьте привязку к onCreate ButterKnife.bind(this);

Теперь сделайте код для кнопки. Метод должен быть общедоступным, и в ButterKnife вам не нужно добавлять onClick в XML. И метод также должен быть вне onCreate. Он автоматически получит кнопку, которую вы назначаете, используя аннотацию, указанную выше в методе,

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

}
@OnClick(R.id.btn_login)
public void submit(View view){ 

   //Do your code here. 

}
person Fahry Mohammed    schedule 19.09.2017

убедитесь, что вы добавили все необходимые зависимости

dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
person Zeinab Abdelmawla    schedule 21.12.2016
comment
ОП упоминает (в комментарии), что он получает ошибки компилятора о разных сигнатурах методов, а не об отсутствующих зависимостях. - person Robert; 21.12.2016
comment
нет, вопрос о ButterKnife onclick не работает, у меня такая же проблема, и я решил ее, добавив отсутствующую зависимость - person Zeinab Abdelmawla; 21.12.2016

Вы должны переместить свой @OnClick из метода onCreate, как я сделал ниже во фрагменте кода.

Код, который я разместил ниже, должен работать так, как предполагается (я также использую ButterKnife).

public class LoginActivity extends ActionBarActivity{
    @InjectView(R.id.toolbar) Toolbar toolbar;
    @InjectView(R.id.btn_login) Button login;

    @OnClick(R.id.btn_login)
    public void submit(View view) {
       // TODO submit data to server...
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        ButterKnife.inject(this);

        initialize();
    }

    private void initialize() {
        setSupportActionBar(toolbar);
        getSupportActionBar().setIcon(R.drawable.toolbar_icon);
        getSupportActionBar().setTitle(null);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}
person Moonbloom    schedule 13.04.2015