2016-08-07 17 views
2

Ich habe einige der Lösungen hier für mein Problem verfolgt, aber keiner von ihnen hat funktioniert. Ich implementierte mit Butterkinfe, aber wenn ich klicke, funktioniert es nicht. Außerdem, wenn ich versuche, den Listener manuell mit setOnClickListener zu implementieren, zeigt es eine Nullreferenz auf , als ob das Butterknife es nicht finden würde.butterknife @OnClick funktioniert nicht

Hier ist das XML-Layout:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:orientation="vertical" 
    tools:context=".view.activity.LoginActivity"> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/bLoadDeliveries" 
     android:text="LOAD DELIVERIES" /> 
</LinearLayout> 

Wenn ich es so machen, es funktioniert einfach so das Layout ist ok: Diese

Button bLoadDeliveries; 

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

     bLoadDeliveries = (Button) findViewById(R.id.bLoadDeliveries); 

     if(bLoadDeliveries == null) 
      Toast.makeText(LoginActivity.this, "Null", Toast.LENGTH_LONG).show(); 
     else { 
      bLoadDeliveries.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        navigator.navigateToDeliveryList(context); 
       } 
      }); 
     } 
    } 

Mit Buttermesser, Compilation OKAY ist und läuft funktionieren gut, aber wenn ich auf den Button klicken, tut es nichts, wie die Verbindung zwischen dem Button und der @OnClick ist überhaupt nicht getan. Warum ist es null? Warum ist nicht verbunden? Irgendwelche Ideen? Danke für die Hilfe!

Dies ist NICHT OKAY

public class LoginActivity extends BaseActivity { 

    @BindView(R.id.bLoadDeliveries) 
    Button bLoadDeliveries; 

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

    // Goes to the user list screen.  
    @OnClick(R.id.bLoadDeliveries) 
    void navigateToUserList() { 

     Toast.makeText(LoginActivity.this, "Hola", Toast.LENGTH_SHORT).show(); 
     this.navigator.navigateToDeliveryList(this); 
    } 
} 

EDITED: Abhängigkeitsdateien

apply from: 'buildsystem/ci.gradle' 
apply from: 'buildsystem/dependencies.gradle' 

buildscript { 
    repositories { 
     jcenter() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.2' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
     classpath "com.fernandocejas.frodo:frodo-plugin:0.8.3" 
    } 
} 
allprojects { 

    ext { 
     androidApplicationId = 'es.app.test.presentation' 
     androidVersionCode = 1 
     androidVersionName = "1.0" 
     testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" 
     testApplicationId = 'es.app.test.presentation.test' 
    } 
} 

task wrapper(type: Wrapper) { 
    description 'Creates the gradle wrapper.' 
    gradleVersion '2.12' 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

dependencies.gradle

allprojects { 
    repositories { 
    jcenter() 
    } 
} 

ext { 
    //Android 
    androidBuildToolsVersion = "24.0.1" 
    androidMinSdkVersion = 23 
    androidTargetSdkVersion = 24 
    androidCompileSdkVersion = 24 

    //Libraries 
    daggerVersion = '2.5' 
    butterKnifeVersion = '8.2.1' 
    recyclerViewVersion = '24.1.1' 
    rxJavaVersion = '1.1.8' 
    rxAndroidVersion = '1.2.1' 
    javaxAnnotationVersion = '1.0' 
    javaxInjectVersion = '1' 
    gsonVersion = '2.4' 
    okHttpVersion = '3.4.1' 
    androidAnnotationsVersion = '24.1.1' 
    sqliteAssetHelperVersion = '2.0.1' 

    //Testing 
    robolectricVersion = '3.0' 
    jUnitVersion = '4.12' 
    assertJVersion = '1.7.1' 
    mockitoVersion = '1.9.5' 
    dexmakerVersion = '1.0' 
    espressoVersion = '2.0' 
    testingSupportLibVersion = '0.1' 

    //Development 
    leakCanaryVersion = '1.3.1' 

    presentationDependencies = [ 
     daggerCompiler:  "com.google.dagger:dagger-compiler:${daggerVersion}", 
     dagger:    "com.google.dagger:dagger:${daggerVersion}", 
     butterKnife:  "com.jakewharton:butterknife:${butterKnifeVersion}", 
     recyclerView:  "com.android.support:recyclerview-v7:${recyclerViewVersion}", 
     rxJava:    "io.reactivex:rxjava:${rxJavaVersion}", 
     rxAndroid:   "io.reactivex:rxandroid:${rxAndroidVersion}", 
     javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}", 
    ] 

    presentationTestDependencies = [ 
     mockito:   "org.mockito:mockito-core:${mockitoVersion}", 
     dexmaker:   "com.google.dexmaker:dexmaker:${dexmakerVersion}", 
     dexmakerMockito: "com.google.dexmaker:dexmaker-mockito:${dexmakerVersion}", 
     espresso:   "com.android.support.test.espresso:espresso-core:${espressoVersion}", 
     testingSupportLib: "com.android.support.test:testing-support-lib:${testingSupportLibVersion}", 
    ] 

    domainDependencies = [ 
     daggerCompiler:  "com.google.dagger:dagger-compiler:${daggerVersion}", 
     dagger:    "com.google.dagger:dagger:${daggerVersion}", 
     javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}", 
     javaxInject:  "javax.inject:javax.inject:${javaxInjectVersion}", 
     rxJava:    "io.reactivex:rxjava:${rxJavaVersion}", 
    ] 

    domainTestDependencies = [ 
     junit:    "junit:junit:${jUnitVersion}", 
     mockito:   "org.mockito:mockito-core:${mockitoVersion}", 
    ] 

    dataDependencies = [ 
     daggerCompiler:  "com.google.dagger:dagger-compiler:${daggerVersion}", 
     dagger:    "com.google.dagger:dagger:${daggerVersion}", 
     okHttp:    "com.squareup.okhttp3:okhttp:${okHttpVersion}", 
     gson:    "com.google.code.gson:gson:${gsonVersion}", 
     rxJava:    "io.reactivex:rxjava:${rxJavaVersion}", 
     rxAndroid:   "io.reactivex:rxandroid:${rxAndroidVersion}", 
     javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}", 
     javaxInject:  "javax.inject:javax.inject:${javaxInjectVersion}", 
     androidAnnotations: "com.android.support:support-annotations:${androidAnnotationsVersion}", 
     sqliteAssetHelper: "com.readystatesoftware.sqliteasset:sqliteassethelper:${sqliteAssetHelperVersion}" 
    ] 

    dataTestDependencies = [ 
     junit:    "junit:junit:${jUnitVersion}", 
     assertj:   "org.assertj:assertj-core:${assertJVersion}", 
     mockito:   "org.mockito:mockito-core:${mockitoVersion}", 
     robolectric:  "org.robolectric:robolectric:${robolectricVersion}", 
    ] 

    developmentDependencies = [ 
     leakCanary: "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}", 
    ] 
} 

Präsentationsmodul

apply plugin: 'com.android.application' 
apply plugin: 'android-apt' 
apply plugin: 'com.fernandocejas.frodo' 

frodo { 
    enabled = true 
} 

android { 
    def globalConfiguration = rootProject.extensions.getByName("ext") 

    compileSdkVersion globalConfiguration.getAt("androidCompileSdkVersion") 
    buildToolsVersion globalConfiguration.getAt("androidBuildToolsVersion") 


    defaultConfig { 

     minSdkVersion globalConfiguration.getAt("androidMinSdkVersion") 
     targetSdkVersion globalConfiguration.getAt("androidTargetSdkVersion") 

     applicationId globalConfiguration.getAt("androidApplicationId") 
     versionCode globalConfiguration.getAt("androidVersionCode") 
     versionName globalConfiguration.getAt("androidVersionName") 
     testInstrumentationRunner globalConfiguration.getAt("testInstrumentationRunner") 
     testApplicationId globalConfiguration.getAt("testApplicationId") 

    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 

    packagingOptions { 
     exclude 'LICENSE.txt' 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/ASL2.0' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
    } 

    lintOptions { 
     quiet true 
     abortOnError false 
     ignoreWarnings true 
     disable 'InvalidPackage'   //Some libraries have issues with this. 
     disable 'OldTargetApi'    //Lint gives this warning but SDK 20 would be Android L Beta. 
     disable 'IconDensities'    //For testing purpose. This is safe to remove. 
     disable 'IconMissingDensityFolder' //For testing purpose. This is safe to remove. 
    } 

    signingConfigs { 
     debug { 
      storeFile file('../buildsystem/debug.keystore') 
      storePassword 'android' 
      keyAlias 'androiddebugkey' 
      keyPassword 'android' 
     } 
    } 


    /* buildTypes { 
      release { 
       minifyEnabled false 
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
      } 
     } 
    */ 

    buildTypes { 
     debug { 
      signingConfig signingConfigs.debug 
     } 
    } 
} 

dependencies { 

    def presentationDependencies = rootProject.ext.presentationDependencies 
    def presentationTestDependencies = rootProject.ext.presentationTestDependencies 
    def developmentDependencies = rootProject.ext.developmentDependencies 

    compile project(':domain') 
    compile project(':data') 

    compile 'com.android.support:appcompat-v7:24.1.1' 

    apt presentationDependencies.daggerCompiler 
    compile presentationDependencies.dagger 
    compile presentationDependencies.butterKnife 
    apt presentationDependencies.butterKnife 
    compile presentationDependencies.recyclerView 
    compile presentationDependencies.rxJava 
    compile presentationDependencies.rxAndroid 
    provided presentationDependencies.javaxAnnotation 

    androidTestCompile presentationTestDependencies.mockito 
    androidTestCompile presentationTestDependencies.dexmaker 
    androidTestCompile presentationTestDependencies.dexmakerMockito 
    androidTestCompile presentationTestDependencies.espresso 
    androidTestCompile presentationTestDependencies.testingSupportLib 

    //Development 
    compile developmentDependencies.leakCanary 
+0

Können Sie Ihre Build-Dateien auf App-Ebene und Modulebene anzeigen? – MidasLefko

+0

Ich denke, das hat nichts mit den Gradle-Dateien auf Modul- oder App-Ebene zu tun. Also habe ich sie entfernt. Es ist besser zu sehen, warum es die Null Pointer Exception beim Zugriff auf die Schaltfläche im zweiten Code erhält. –

+0

Ich weiß nicht, warum es NULL bekommt. Aber trotzdem kann ich dir ein paar Vorschläge machen. Die IDs in der Layout-Datei sollten wie folgt benannt werden: 'b_load_deliverables'. Und Sie müssen die Schaltfläche nicht binden, um das 'onClick' zu dieser Schaltfläche zu implementieren. Am wichtigsten ist es, die Funktion 'onClick' als 'public' zu deklarieren.Lass mich wissen, ob es hier eine Lösung gibt. –

Antwort

0

Ich schaute auf Ihren ursprünglichen Beitrag (Pre-Edit) und es scheint, dass in Ihrem Präsentationsmodul Gradle-Datei haben Sie apply plugin: 'com.neenbedankt.android-apt' Das sollte apply plugin: 'android-apt' sein (siehe butterknife readme.md).

Haben Sie auch diese Linie in Ihrem Gerät überall: apt 'com.jakewharton:butterknife-compiler:8.2.1'? Ich sehe das: compile presentationDependencies.butterKnife' aber würde das nicht in apt "com.jakewharton:butterknife:8.2.1", wenn das Skript ausgeführt wird (dh fehlt der "-Compiler")?

EDITED

In Ihrem dependencies.gradle, in den presentationDependencies die folgende Zeile hinzufügen:

presentationDependencies = [  
    butterKnifeApt:  "com.jakewharton:butterknife-compiler:${butterKnifeVersion}", 
] 

Dann in Ihrem Präsentationsmodul ändern:

apt presentationDependencies.butterKnife 

zu:

apt presentationDependencies.butterKnifeApt 
+0

Ich habe das alles gemacht, es wurde gepostet, aber ein Admin hat es entfernt (anscheinend war es eine unnötige Info :() Es gibt das Kompilieren und ein "apt" danach. Ich benutze auch das Plugin: 'android-apt' und keine Änderungen ... Das Ändern von Variablennamen funktioniert auch nicht – Toni

+0

Also nur um super klar zu sein - die folgenden Zeilen BEIDE enden in deinem build.gradle: 'compile 'com.jakewharton: buttermesser: 8.2.1' apt 'com.jakewharton: butterknife-compiler: 8.2.1'' – MidasLefko

+0

Ich werde versuchen, den Beitrag wieder zu bearbeiten, hoffe, niemand entfernt es wieder bitte – Toni