web-dev-qa-db-ja.com

kotlinx.Android.synthetic未使用Androidスタジオの問題

私はkotlin + Rxjava + MVVMを使用して1つのプロジェクトに取り組んでいます。開発中に、フラグメントまたはビューホルダーにビューIDをインポートする問題に直面しています。

import kotlinx.Android.synthetic.main.layout.* kotlinでは未使用。

kotling synthetic imports is unused

通常、ビューIDはkotlin合成レイアウトインポートから使用する必要がありますが、R.idから直接インポートする必要があります。

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
    }
}

また、クリーンビルドとプロジェクトのリビルドも試みました。

この問題をどのように解決できますか?

18

Android Studio 3.1.3を使用していますが、同じ問題が発生しました。すべてのコードをJava/からkotlin/ディレクトリ内のmain/

app/
 |-- src/
 |    |-- main/
 |    |    |-- Java/
 |    |    |     |-- com.example.Android.app
 |    |    |-- kotlin/  <-- (use this)
 |    |    |     |-- com.example.Android.app

次に、kotlin/ソースセットの一部として:

app/build.gradle

Android {
   sourceSets {
       main.Java.srcDirs += 'src/main/kotlin'
   }
}

場合によっては、プロジェクトを同期および再構築して、kotlinx.Android....

参照: kotlinコードを追加

6
jzarsuelo

このスレッドで報告されたソリューションを含むいくつかのアプローチを試しました。 here を見るとわかるように、多くの人がこの厄介な問題に直面していることもわかりました。

それにもかかわらず、私にとってこれまで働いていたこの問題に最も近い解決策は、apply plugin: kotlin-Android-extensions gradleから、Sync gradleプラグインを追加し、再度追加します。

5
Wahib Ul Haq

私は同じ問題を抱えており、何日も解決しようとしています...

できることの1つは、プロジェクトスコープのインポートと完了から除外<package-name>.R.id.*です。

Settings/Editor/Auto Importに移動して追加します。

これにより問題が改善され、これを実行してプロジェクトをクリーンにすれば機能しますが、問題は完全には解決しません。多くの場合、インポートはnused importsとして再表示され、プロジェクトを何度もクリーンアップする必要があります:

---([〜#〜]編集済み[〜#〜]

また、私が達成した別の改善点は、XMLでincludesを使用することです。たとえば、複数の画面で「同じ」ボタンを使用する場合、このボタンに特定のレイアウトを作成し、いくつかのアクティビティ/フラグメントで再利用します。この特定のレイアウト内でidを設定すると、コンテンツビューの参照が事前に宣言されているため、コンテクストは競合を生成せずに自動インポートします。

簡単な例を示します。

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)idsを設定するのは面倒だと認めざるを得ないアクティビティ/フラグメント間のインポートを処理するため/常に表示します。

2
Gabriel Moreno

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) }
    }
}
1
Kirill Vashilo

これが他の人をつまずかせたかどうかはわかりませんが、合成オブジェクトがActivityDialog、またはFragment。他のクラスにいる場合( ConductorControllerを使用するなど)、運が悪い。

0
A. L. Flanagan

合成インポートに関する既存の問題(割り当てられている)がGoogleトラッカーにあります。 https://issuetracker.google.com/issues/78547457

0
bpb

指揮者の場合:

この基本クラスを作成します。

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
ClayHerendeen