2017-01-23 3 views
5

私はコトルには初めてです。他の非常に興味深いものの中でも、according to the documentationというAndroidの拡張機能は、findViewByIdを必要とせずにアクティビティのビューを使用できるようにする必要があります。コトリンの合成特性が矛盾します

実はそれは私の輸入にだけこの行を追加することで非常にうまく機能:二つの異なるレイアウトは同じid(合成プロパティのすなわち同じ名前)とウィジェットが含まれている場合

import kotlinx.android.synthetic.main.<layout>.* 

問題があり、
id txtTitleの2つの異なるTextViewです。最初のアクティビティがアクティビティにあり、2番目のアクティビティがアダプタ内で使用されているレイアウトに属しているとします。

最初のTextView(アクティビティのもの)でメソッドを呼び出そうとすると、呼び出しが別のビューで実行されたかのように、予期した結果が表示されません。これの確認として、私がtxtTitle.parentと呼ぶとき、私は期待されるものではなく、他のtxtTitleの親と兄弟を見る。

何か間違っていますか? ...

+0

あなたのIDにもっと複雑な名前を使用することをお勧めします:)それは私のケースでもインポートで「再生」できなくなります。 – UneXp

+0

これがあなたの質問に答えるかどうかは分かりませんが、合成呼び出しは 'findviewById'への呼び出しに変換され、すべてのid ** name **は一意の値にマップされているので、重要ではありません*正しい名前のものを使用しているためです。 –

+0

私は想像しましたが、実際には悪いです。私はtxtTitleを持つアクティビティを持っています。このアクティビティの中には、RecyclerViewを持つフラグメントがあります:RecyclerViewの中には、txtTitleを持つビューがあります。私はちょうど私が書いたものを見ているだけです。アクティビティの中でtxtTitleを使用すると、期待される結果が得られません(TextViewのテキストは設定されません)。代わりに、私がアクティビティからfindViewById()を使用すると、正しく動作します... – Massimo

答えて

3

私はこの問題を回避するために見つけた唯一の方法は、すべて私のレイアウトで異なる名前を使用するかfindViewByIdを使用し続けることですが、この言語機能を無駄に残念だろうkotlin documentation on imports

を語ります

名前の衝突があった場合、我々はあなたが別の別名でレイアウトをインポートしようとする可能性が激突を行うエンティティ

の名前を変更し、ローカルにasキーワードを使用することにより明確にすることができます

import kotlinx.android.synthetic.main.<layoutActivity>.* as lActivity 
import kotlinx.android.synthetic.main.<layoutView>.* as lView 

とそれに対応する修飾子でtextviewsを使用する:あなたの問題に対する他の可能な解決策は一つだけをインポートし、必要なすべてのIDが、その一つに存在していると仮定すると、他を省略してあるlActivity.txtTitlelView.txtTitle

+0

複数のインポートステートメントで "as"キーワードを使用することはできません。IDE(Android Studio)は "インポートされたすべてのアイテムを1つの識別子に名前変更できません"というメッセージを表示して警告します。さらに、自分のアクティビティでは、アクティビティではなく、(アクティビティに添付された)フラグメントによって使用されるため、レイアウトのインポートは行っていません。 – Massimo

0

昨日の終わりに、同様のIDが同じものを指していて、1つのレイアウトからインポートされたのか、それとも他のレイアウトからインポートされたのかはまったく関係ありません。

あなたはTextViewは異なるレイアウトから同じIDを持つためのものの下に試すことができます

-1

に役立ちます願っています。 extra_layoutからTextViewためactivity_mainlView.text = "Some text"からTextViewため

import kotlinx.android.synthetic.main.activity_main.text_hello as lActivity 

import kotlinx.android.synthetic.main.extra_layout.text_hello as lView 

使用lActivity.text = "Some text"