web-dev-qa-db-fra.com

ButterKnife onclick ne fonctionne pas

J'ai injecté des vues parfaitement en utilisant la bibliothèque butterknife. Mais quand j'essaye d'implémenter des écouteurs, par exemple onclick je ne suis pas en mesure de les implémenter. Le code Java Java vous aidera à comprendre mon problème.

Code 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);
    }
}

Dites-moi pourquoi cela se produit. Quelque chose ne va pas dans le code? J'ai déjà configuré le IDE qui est compatible avec ButterKnife en utilisant l'URL suivante.

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

Veuillez me faire part de vos suggestions concernant ce problème. Merci d'avance..

22
malli

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();
    }
}

et la partie 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>

dans le fichier build.gradle (app)

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:22.0.0'
    compile 'com.jakewharton:butterknife:6.1.0'
}
14
vinay Maneti

Dans mon cas, c'est ma solution

add classpath in gradle ( Project )

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

et gradle ( Module ) add apply and 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'
}

fichier Java

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

Vous devriez avoir à lier butterKnife avant d'utiliser les annotations.

Ajoutez ces dépendances à gradle.build

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

Ajoutez ensuite bind à onCreate ButterKnife.bind(this);

Maintenant, faites le code de Button. La méthode doit être publique et dans butterKnife, vous n'avez pas besoin d'ajouter le onClick en XML. Et la méthode devrait également être en dehors de onCreate Il obtiendra automatiquement le bouton que vous attribuez en utilisant l'annotation donnée au-dessus de la méthode,

@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. 

}
5
Fahry Mohammed

assurez-vous d'ajouter toutes les dépendances requises

dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
4
Zeinab Abdelmawla

Vous devez déplacer votre @OnClick hors de la méthode onCreate, comme je l'ai fait ci-dessous dans l'extrait de code.

Le code que j'ai posté ci-dessous devrait fonctionner comme il est censé le faire (j'utilise également 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);
    }
}
2
Moonbloom