2017-01-23 77 views
5

我是Kotlin的新手。在其他非常有趣的事情中,我發現Android擴展應該讓我在不需要findViewById的情況下使用活動的觀點。Kotlin綜合性能衝突

其實它工作得很好,僅僅加入這一行我進口:

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

的問題是當兩個不同的佈局包含具有相同ID(對於綜合性能,即相同的名稱)的窗口小部件,
eg兩個不同的TextView,其編號爲txtTitle。假設第一個屬於一個活動,第二個屬於適配器內部使用的佈局。

當我嘗試在第一個TextView(活動的一個)上調用方法時,我看不到預期的結果,就好像該調用將在另一個視圖上完成一樣。作爲對此的確認,當我撥打txtTitle.parent時,我看到其他txtTitle的父母和兄弟姐妹,而不是預期的父母和兄弟姐妹。

我做錯了什麼?我發現繞過這個問題的唯一辦法是在我所有的佈局,使用不同的名稱,或者繼續使用findViewById,但它會浪費這個語言功能可惜......

+0

我想推薦你爲你的ID使用更復雜的名稱:)它防止在我的情況下與進口「玩」。 – UneXp

+0

不知道這是否回答你的問題,但綜合調用轉換爲調用'findviewById',並且因爲每個ID **名稱**映射到一個唯一的值,這沒關係*您使用哪個導入因爲你使用了正確的名字。 –

+0

我想象中,但實際上它工作不好。我有一個txtTitle的活動,在這個活動裏面有一個帶有RecyclerView的片段:在RecyclerView裏面有一個帶有txtTitle的視圖。我只看到我寫的內容:當我在活動內部使用txtTitle時,它不會產生預期的結果(它不會設置TextView的文本);相反,如果我使用findViewById()從活動它的工作正確... – Massimo

回答

3

kotlin documentation on imports

如果有名稱衝突,我們可以通過as關鍵字在本地重命名爭食實體

所以,你可以嘗試使用不同的別名導入佈局歧義10

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

並使用具有相應資格的textviews:lActivity.txtTitlelView.txtTitle

+0

我無法在多重導入語句中使用「as」關鍵字,IDE(Android Studio)會通過消息「無法將所有導入的項目重命名爲一個標識符」向我發出警告。此外,在我的活動中,我沒有導入佈局,因爲它被一個片段(附加到活動)使用,而不是活動。 – Massimo

0

另一種可能的解決問題的方法是隻導入一個而忽略另一個,假設你需要的是存在於一個所有ID。

在一天結束時,類似的ID指向相同的事物,它是從一個佈局導入還是從另一個佈局導入並不重要。

希望幫助

-1

你可以試試下面的事情TextView從不同的佈局具有相同的ID。

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"TextViewactivity_mainlView.text = "Some text"TextViewextra_layout