kotlinx.android.syntetic неиспользованная проблема андроид студии - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над одним проектом, используя kotlin + Rxjava + MVVM.Во время разработки возникает проблема импорта идентификаторов представлений во фрагмент или видоискатель.

import kotlinx.android.synthetic.main.layout.* не используется с kotlin.

kotling synthetic imports is unused

Идентификатор обычного представления следует использовать при импорте синтетических макетов kotlin, но он напрямую импортируется изИ это не должно происходить.

Версия плагина Kotlin: org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40

Мой файл Gradle :

apply plugin: 'com.android.feature'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'idea'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 27
    baseFeature true
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


    lintOptions {
        abortOnError false
    }
}

dependencies {

    api "com.android.support:design:$rootProject.support_library_version"
    api "com.android.support:appcompat-v7:$rootProject.support_library_version"
    api "com.android.support:recyclerview-v7:$rootProject.support_library_version"
    api "com.android.support:support-dynamic-animation:$rootProject.support_library_version"
    api "com.android.support:cardview-v7:$rootProject.support_library_version"
    api "com.android.support:customtabs:$rootProject.support_library_version"

    api "com.android.support.constraint:constraint-layout:1.1.0-beta5"
    api 'android.arch.lifecycle:extensions:1.1.0'


    api 'androidx.core:core-ktx:0.2'


    api "com.google.dagger:dagger:$rootProject.dagger_version"
    kapt "com.google.dagger:dagger-compiler:$rootProject.dagger_version"

    api "android.arch.persistence.room:runtime:$rootProject.room_version"
    kapt "android.arch.persistence.room:compiler:$rootProject.room_version"
    testImplementation "android.arch.persistence.room:testing:$rootProject.room_version"
    api "android.arch.persistence.room:rxjava2:$rootProject.room_version"
    androidTestImplementation "android.arch.core:core-testing:$rootProject.room_version"
    testImplementation "android.arch.core:core-testing:$rootProject.room_version"

    api "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"


    api 'com.jakewharton.timber:timber:4.5.1'

    api "com.android.support:multidex:1.0.3"

    api "com.github.bumptech.glide:glide:$rootProject.glide_version"
    api "jp.wasabeef:glide-transformations:$rootProject.glide_transformation_version"
    api 'com.github.bumptech.glide:okhttp3-integration:1.5.0@aar'

    api "io.reactivex.rxjava2:rxandroid:$rootProject.rxAndroid_version"
    api "io.reactivex.rxjava2:rxjava:$rootProject.rxJava_version"
    api "com.google.code.gson:gson:$rootProject.gson_version"

    api("com.squareup.retrofit2:retrofit:$rootProject.retrofit_version") {
        // exclude Retrofit’s OkHttp peer-dependency module and define your own module import
        exclude module: 'okhttp'
    }

    api "com.squareup.okhttp3:okhttp:$rootProject.okhttp_version"
    api "com.squareup.okhttp3:logging-interceptor:$rootProject.okhttp_version"
    api "com.squareup.retrofit2:adapter-rxjava2:$rootProject.retrofit_version"
    api "com.squareup.retrofit2:converter-gson:$rootProject.retrofit_version"

    api 'com.jakewharton.threetenabp:threetenabp:1.0.5'

    api "com.google.firebase:firebase-invites:$rootProject.play_services_version"
    api "com.google.firebase:firebase-core:$rootProject.play_services_version"
    api "com.google.firebase:firebase-config:$rootProject.play_services_version"
    api "com.google.firebase:firebase-perf:$rootProject.play_services_version"
    api "com.google.firebase:firebase-auth:$rootProject.play_services_version"
    api "com.google.firebase:firebase-firestore:$rootProject.play_services_version"



    api("com.firebaseui:firebase-ui-auth:$rootProject.firebase_ui_version") {
        // exclude Retrofit’s OkHttp peer-dependency module and define your own module import
        exclude module: 'play-services-auth'
        exclude module: 'firebase-auth'
    }

    // Required only if Facebook login support is required
    api('com.facebook.android:facebook-android-sdk:4.31.0')

    api "com.google.android.gms:play-services-auth:$rootProject.play_services_version"

    // Required only if Twitter login support is required
    api("com.twitter.sdk.android:twitter-core:3.0.0@aar") { transitive = true }

    api 'com.jakewharton.rxbinding2:rxbinding-kotlin:2.0.0'
    api 'com.jakewharton.rxbinding2:rxbinding-support-v4-kotlin:2.0.0'
    api 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7-kotlin:2.0.0'
    api 'com.jakewharton.rxbinding2:rxbinding-design-kotlin:2.0.0'

    api('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
        transitive = true
    }
}

Я также пыталсяЧистая сборка и перестройка проекта.

Есть идеи, как мне решить эту проблему?

Ответы [ 7 ]

0 голосов
/ 15 сентября 2018

Я решил похожие проблемы для реализаций ViewHolder:

Мы должны унаследовать реализацию нашего класса ViewHolder от LayoutContainer. LayoutContainer - это интерфейс, доступный в пакете kotlinx.android.extensions.

У вас будет такой код:

class TaskVH(override val containerView: View, val itemListener: TasksFragment.TaskItemListener) : RecyclerView.ViewHolder(containerView), LayoutContainer {
    fun bindItem(task: Task) {
        item_title.text = ""
        item_complete.isChecked = task.isCompleted
        itemView.setBackgroundResource(rowViewBackground)
        itemView.setOnClickListener { itemListener.onTaskClick(task) }
    }
}
0 голосов
/ 12 февраля 2019

для проводника:

Создать этот базовый класс.

import android.os.Bundle
import android.view.View
import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.RestoreViewOnCreateController

abstract class BaseController(
        bundle: Bundle? = null
) : RestoreViewOnCreateController(bundle){

    init {
        addLifecycleListener(object : LifecycleListener() {
            override fun postCreateView(controller: Controller, view: View) {
                onViewCreated(view)
            }
        })
    }

    open fun onViewCreated(view: View) { }

}

Тогда в вашем контроллере:

import kotlinx.android.synthetic.main.controller_example.view.*

class ProfileController : BaseController() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedViewState: Bundle?): View {
        return inflater.inflate(R.layout.controller_example, container, false)
    }

    override fun onViewCreated(view: View) {     
        view.txtName.text = "Example"
    }

}
0 голосов
/ 11 июля 2018

Я не знаю, спровоцировало ли это кого-то еще, но у меня были проблемы, потому что я не осознавал, что синтетические объекты доступны, только если вы внутри Activity, Dialog или Fragment , Если вы учитесь в каком-то другом классе (например, используете Conductor Controller), вам не повезло.

0 голосов
/ 27 июня 2018

Существует существующая проблема (которая назначена) на трекере Google относительно синтетического импорта.https://issuetracker.google.com/issues/78547457

0 голосов
/ 24 июня 2018

Я использую Android Studio 3.1.3 и столкнулся с той же проблемой. Мне удалось решить эту проблему, переместив все мои коды из каталога java/ в kotlin/ внутри main/.

app/
 |-- src/
 |    |-- main/
 |    |    |-- java/
 |    |    |     |-- com.example.android.app
 |    |    |-- kotlin/  <-- (use this)
 |    |    |     |-- com.example.android.app

Затем добавьте kotlin/ как часть исходных наборов:

Приложение / build.gradle

android {
   sourceSets {
       main.java.srcDirs += 'src/main/kotlin'
   }
}

Иногда для правильного импорта kotlinx.android....

все еще требуется синхронизировать и перестроить проект.

Ссылка: Добавить код котлина

0 голосов
/ 11 июня 2018

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

Тем не менее, наиболее близким решением этой проблемы, которое до сих пор работало для меня, является удаление apply plugin: kotlin-android-extensions из gradle, Sync gradle plugin, а затем добавление его снова.

0 голосов
/ 30 апреля 2018

У меня та же проблема, и я пытаюсь решить ее слишком много дней ...

Один трюк, который вы можете сделать, это Исключить из импорта и завершения <package-name>.R.id.* для области проекта.

Перейдите к Settings/Editor/Auto Import, чтобы добавить его.

Это улучшает нашу проблему, и если вы сделаете это и очистите проект, он будет работать, но не решит проблему полностью. Много раз импорт снова появляется как неиспользованный импорт , и необходимо очищать проект снова и снова: - (.

EDITED

Кроме того, еще одно улучшение, которое я достиг, - работа с include s на XML. Например, если я собираюсь использовать «одну и ту же» кнопку на нескольких экранах, я создаю определенный макет для этой кнопки и повторно использую ее для нескольких действий / фрагментов. Вы можете установить идентификатор в этом конкретном макете, и синтетический будет автоматически импортировать его без возникновения конфликтов, так как у вас есть ссылка на представление содержимого, объявленная ранее.

Я покажу вам простой пример:

activity_main.xml

<!-- ... -->

<include layout="@layout/btn_foo"/>

<!-- ... -->

btn_foo.xml

<?xml version="1.0" encoding="utf-8"?>
<Button
    android:id="@+id/btnFoo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android"/>

MainActivity.kt

// ...

import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.btn_foo.*

// ...

setContentView(R.layout.activity_main)

// ...

btnFoo.setOnClickListener { }

Я должен признать, что в других случаях Я вернулся к типичному венгерскому соглашению whatWhereDescription (Size) для установки id s из-за слишком сильно раздражает иметь дело с импортом среди видов деятельности / фрагментов / просмотра постоянно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...