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..
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'
}
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...
}
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.
}
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'
}
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);
}
}