私はkotlin + Rxjava + MVVMを使用して1つのプロジェクトに取り組んでいます。開発中に、フラグメントまたはビューホルダーにビューIDをインポートする問題に直面しています。
import kotlinx.Android.synthetic.main.layout.*
kotlinでは未使用。
通常、ビュー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
}
}
また、クリーンビルドとプロジェクトのリビルドも試みました。
この問題をどのように解決できますか?
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コードを追加
このスレッドで報告されたソリューションを含むいくつかのアプローチを試しました。 here を見るとわかるように、多くの人がこの厄介な問題に直面していることもわかりました。
それにもかかわらず、私にとってこれまで働いていたこの問題に最も近い解決策は、apply plugin: kotlin-Android-extensions
gradleから、Sync
gradleプラグインを追加し、再度追加します。
私は同じ問題を抱えており、何日も解決しようとしています...
できることの1つは、プロジェクトスコープのインポートと完了から除外<package-name>.R.id.*
です。
Settings/Editor/Auto Import
に移動して追加します。
これにより問題が改善され、これを実行してプロジェクトをクリーンにすれば機能しますが、問題は完全には解決しません。多くの場合、インポートはnused importsとして再表示され、プロジェクトを何度もクリーンアップする必要があります:。
---([〜#〜]編集済み[〜#〜]
また、私が達成した別の改善点は、XMLでinclude
sを使用することです。たとえば、複数の画面で「同じ」ボタンを使用する場合、このボタンに特定のレイアウトを作成し、いくつかのアクティビティ/フラグメントで再利用します。この特定のレイアウト内で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)がid
sを設定するのは面倒だと認めざるを得ないアクティビティ/フラグメント間のインポートを処理するため/常に表示します。
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) }
}
}
これが他の人をつまずかせたかどうかはわかりませんが、合成オブジェクトがActivity
、Dialog
、またはFragment
。他のクラスにいる場合( Conductor のController
を使用するなど)、運が悪い。
合成インポートに関する既存の問題(割り当てられている)がGoogleトラッカーにあります。 https://issuetracker.google.com/issues/78547457
指揮者の場合:
この基本クラスを作成します。
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"
}
}