web-dev-qa-db-ja.com

Android St​​udio 3.1.3-未解決の参照:R-Kotlin

私はkotlinを初めて使用し、Javaからいくつかのコードを変換しましたが、何か問題があるようです。findViewById(R.id.my_id)のRが赤で強調表示され、次のメッセージが表示されます。参照:R "..私は解決策を探していましたが、それを理解していないようです。これがスクリーンショットです:

enter image description here

28
Tamim Attafi

この問題は多くの要因によって引き起こされる可能性がありますが、

  • この中のmartomstomで言及されているように 回答 この問題は時々com.Android.tools.build:gradleバージョンによって引き起こされ、バージョンをより安定したものに変更すると問題が解決します:例えば:com.Android.tools.build:gradle:3.4.0-alpha02 with com.Android.tools.build:gradle:3.2.1
  • また、同じグループのライブラリで異なるバージョンを使用すると、問題が発生したり、実行時エラーが発生する可能性があります。次のようなグループの除外メソッドを使用します。implementation('com.squareup.picasso:picasso:2.71828') { exclude(group: 'com.Android.support') }この場合、picassoライブラリはAndroid.supportコンポーネントを使用します。picassoで使用されるAndroidライブラリバージョンは、現在使用しているものとは異なります。そのため、この問題を解決するには、サブライブラリとクラスグループから完全に除外する必要があります。

  • リソースとコードの不一致によっても発生する可能性があります。アクティビティにこのインポート行を含めると、問題が解決する場合があります:import com.package.name.R

  • IDE、パフォーマンス、またはメモリが原因で発生する場合があります。プロジェクトを時々クリーニングすると、時間を節約できる場合があります。Android St​​udioではBuild -> Clean Project / Rebuild Project-IDEキャッシュのクリーニングはパフォーマンスとメモリにも役立ちます。Android St​​udioではFile-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
  • 新しいリソースをインポートするときに、ほとんどの場合、この問題が発生することに気付きました。名前に禁止文字を使用すると、. , , - , UpperCase or special Lettersなどのエラーが発生します
  • 提案として、Kotlinを使用している場合、アクティビティでKotlin拡張機能を使用することをお勧めします:import kotlinx.Android.synthetic.main.activity_page.*またはifカスタムビューを使用している場合:kotlinx.Android.synthetic.main.view_layout.view.*その後、アクティビティのonCreat()メソッドで、呼び出す必要があるのはid、たとえば:my_edit_text_ID.text = "Kotlin Dbest!"、またはカスタムビューから:mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"

編集:

  • 私は再びこの問題に直面しましたが、問題は '' R ''ライブラリが2つの異なるソースからインポートされたことでした:

    com.Android.R

    com.example.package.R

    アプリケーションパッケージ名を持つ '' R ''ライブラリのみをインポートする必要があります。この場合はcom.example.package.Rライブラリがまったくインポートされない場合があります。インポートするには、未解決の参照Rをクリックして押しますAlt + Enter

18
Tamim Attafi

Com.Android.tools.build:gradle:3.3.0-alpha13を使用しましたが、同じ問題がありました。安定したバージョン3.2.1に変更すると、この問題は解決しました。

27
martomstom

したがって、これは誤解を招くエラーです。

私は何が起こっているの30,000フィートのビューを説明するつもりです。これは厳密な順序でも厳密なフローでもありません。かなり近いです;)あなたがより多くを知っているなら、私は正確な順序をしてリンクで修正することに気をつけてください、私はyaを止めません:).

プロセス

Rファイルは生成されたコードです。

世代には秩序があります。

Gradleは魔法を実行し、依存関係を引き出し、最初に警告とエラーツリーを開始します。

その後、AndroidはすべてのKotlinを舞台裏でJavaに変換します。そうです、私たちの愛するKotlinは、愛するART仮想マシン用にコンパイルするために、まだJavaでなければなりません。

その後、実行され、JVM Staticsおよび他のいくつかのタスク用に作成したアダプターが実行されます。次に、すべてのxmlデータバインディングファイルをコンパイルして、生成されたデータバインディングファイルを作成します。

すべてが成功すると、資産とリソースの処理に進みます。コードで参照する各リソースのポインターまたはIDを作成します。次に、実行され、その後、コードとパッケージングプロセスのコンパイルが開始されます。

かなり簡単なプロセスですが、ここに問題があります。

誤解を招くエラー

R生成が完了する前にいずれかのステップが失敗した場合、Rは生成されません。単純な再構築だけで十分な場合もあれば、単純な「ファイル」->「キャッシュの無効化と再起動」だけで十分な場合もあります。ただし、ほとんどの場合、gradle、xml、databinding、またはアダプターにコードの問題があり、コンパイラーがR生成段階に到達することさえ妨げています。

つまり、次の質問は

「さて、エラーが価値がないか存在しない場合、どのようにトラブルシューティングしますか」。

まず、これらのエラーが発生するさまざまな方法について説明しましょう。

  • 重複するデータバインディングクラスが見つかりました
  • 行番号でのXMLバインディングエラー
  • Bind:customAdapterMethodの一致する署名が見つかりませんでした
  • 正しいプロジェクトのRファイルが見つかりません。サブモジュールのインポートオプションまたは不正な名前空間Rファイルのみが表示されます。
  • アクティビティ/フラグメントのDataBindingUtilityまたはDataBindingが見つかりませんでした
  • そして、他の多くのさまざまな方法、それらをすべてリストするには多すぎます

次に、問題を引き起こす可能性のある候補について話しましょう。すっごくたくさんあるので笑。

  • Gradle同期の問題
  • キャッシュの問題(ファイル->キャッシュの再起動と無効化)
  • 間違った名前空間を持つxml要素
  • 無効なIDまたは参照IDを持つxml要素が順番に並んでいない(つまり、xmlドキュメント内で下位の要素の右に揃えてから、参照しようとしている兄弟要素)
  • 存在しないか、正しく入力されていない名前空間またはメンバーを参照するXMLデータバインディングの問題
  • アダプターを使用したカスタム属性など、自動入力されていないスポットでのXMLデータバインディングの問題。すなわちbind:myCustomMethod = @ "myObject.mistypedProperty()"
  • 問題または重複した署名を持つJVM静的アダプター
  • 文字列またはDimensファイルまたはその他のxmlファイルでの重複または不良文字
  • アクセスするプロパティのない@Bindingとしてマークされたプライベート変数
  • 親クラスのメソッドと一致する@Bindingのマークが付けられたメンバー変数は、ほとんど不可能なエラーで現れる重複を引き起こします
  • (Int)を受け取るが、データバインディングを介して渡される(Int?)アダプターを使用するなど、型の不一致は、コンパイル時までJVM Staticsで認識されません
  • ポップアップでIMPORTを選択して、アプリケーションファイルの代わりにサブモジュールのRファイルをインポートした
  • 子または親クラスにバインド可能なメンバーがありますが、親または子クラスのXML使用でクラスキャストに完全修飾ネームスペースを与えていません。データバインディングコンパイラは、Fooクラスに提供される変数がparentFooベースクラスでもあることを認識するほどスマートではないため、Android:text = "@((com.path.parentFoo)foo).parentMethod"として修飾する必要があります。
  • 「@Bindingメンバー変数から生成されたプロパティ」、つまり変数としてのfirstNameに一致するクラスにメソッド名がありますが、親または子クラスにgetFirstNameと呼ばれるメソッドがあります。自動生成されるため、dataBindingUtility複製クラスエラーが発生します。
  • 他にも原因がありますが、これにより一連の場所を確認できますが、リストは真剣に進むことができます。

残念ながら、これは、端末ツールにまだUIツールが対応していないEdgeテクノロジーのブリーディングでよく起こります。したがって、ターミナルのプロジェクトルートから実行することをお勧めします

bash gradlew assembleRelease --debug

失敗すると、そうなります。実際にエラーが発生し、次の段階が発生しないようにするために、赤が見つかるまでログをスクロールアップし始めます。

これは、データバインディングの処理を開始するときに特に役立ちます。

ヒント:

データバインディングの処理を開始するときは、他のファイルを実行する前にすぐに認識して、生成を中断せず、追加したばかりのコードが問題を引き起こしていることをより簡単に確認できるようにすることを目標としているため、頻繁にコンパイルして実行するようにしてください遠くに行く前に。

先に進む前に問題を確認するためにコンパイルして実行する時間。

  • いくつかのJVM統計を追加してコンパイルして実行する場合
  • 使用する変数をXMLに追加する場合
  • 1ファイルでモデルのプロパティにバインドする場合
  • JVMStaticにバインディングを追加する場合
  • バインド可能なメンバーまたはプロパティをモデルに追加する場合
  • 監視可能なメンバー変数またはプロパティを子または基本クラスに移動するリファクタリングを行う場合
  • 生成されたコードに影響を与える可能性のあるその他のxmlまたはバインディング関連の要素。

上で述べたように、その理由は多くの変更を避けることであり、生成されたデータバインディングコードに関連する一般的な漠然とした恐ろしいエラーを見つけることはトラブルシューティングの悪夢になります。ツールは改善されると確信していますが、今のところは、データバインディング関連のアイテムを変更する際に、自分自身を優先してコンパイルし、頻繁に実行してください。

ハッピーコーディング

6
Sam

Gradleコマンドを使用します。
Android St​​udioの右側のメニュー:
Gradle -> :app -> Tasks -> build -> clean
その後、Gradle -> :app -> Tasks -> build -> build

5
Fireworks

私は同じ問題を抱えていたので、gradleバージョン3.3からgradleバージョン3.2.1にダウングレードしないようにしました。代わりに、Android St​​udioをバージョン3.3に更新しました。

3
HasBert

これは私のために働いた。どのくらいの作業が必要かは、プロジェクトの大きさに依存します。新しいプロジェクトを開始し、必要なモジュール(XML、Kotlin、色、文字列など)を作成し、古いプロジェクトのモジュールから新しいプロジェクトのモジュールにコードをコピーしました。 XMLをコピーすると、UIを再作成する場合に比べて時間を大幅に節約できます。全体として、少し時間がかかりますが、未解決の参照エラーを修正せずに修正するのにもっと多くの時間を費やしました。

0
Earl Whitney

Gradleバージョンのダウングレードはうまくいきました。

私が変更され :

Gradleバージョン:4.10.4から4.4.1

およびGradleプラグインバージョン:3.3.1から3.1.3

0
Ankush Joshi

Android St​​udioをバージョン3.3.1に更新し、この問題を解決しました。

0
dudukee

これを試して

Content_main.xmlファイルに移動し、そこで変更する必要があります

Android:id="@+id/??????">コードの行をファイルに指定したIDに追加します。

疑問符??????を関連するファイルID名に置き換えます(IDがわからない場合は、下部のデザインタブに移動し、関連するアセットをクリックします。

属性の下の右側に、指定したIDがあります。空白の場合、新たに名前を付けることができ、Android St​​udioがコードを記述します。

次に、Android St​​udioを再起動します。これが役立つことを願っています。ハッピーコーディング。

0
PRANAY REDDY

R参照でも同じ問題が発生しました。最後にAndroid St​​udio 3.3がリリースされ、'com.Android.tools.build:gradle:3.3.0'を使用して問題が修正されました!

0
Josue

(偶然ではあるが)本当の答えに出会ったと思う。

また、OPでKTファイルがRに失敗したため、Javaにある他のクラスも失敗しました。私が気づいたのは、ファイル名に大文字と小文字の違いがあるということです。インポートステートメントを修正して、パッケージ(別名、フォルダー)の大文字と小文字を一致させると、エラーは解決しました。

0
Ken