2016-10-21 213 views
11

我有一個自定義的LinearLayout類時,我想這個類來創建實例,我得到一個錯誤lateinit屬性尚未初始化 我使用的是最新版本的butterknife庫lateinit屬性尚未初始化

這是我的科特林級

class MenuItemView : LinearLayout { 

@BindView(R.id.menu_title_text_view_id) 
lateinit var menuTitleTextView : CTextBasic 

constructor(ctx: Context) : super(ctx) { 
} 

init { 
    val view = LayoutInflater.from(context).inflate(R.layout.menu_item,this) 
    ButterKnife.bind(this,view) 
} 

constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) { 
    val menuAttrs = context.theme.obtainStyledAttributes(attrs, R.styleable.MenuItemView, 0, 0) 
    try { 
     val title: String = menuAttrs.getString(R.styleable.MenuItemView_menu_title) 
     menuTitleTextView.text = title 
    }catch (e : Exception){ 
     e.printStackTrace() 
    }finally { 
     menuAttrs.recycle() 
    } 
} 
fun setTitle(title : String){ 
    menuTitleTextView.text = title 
} 
} 

這是錯誤日誌

kotlin.UninitializedPropertyAccessException: lateinit property menuTitleTextView has not been initialized 
at com.leavigstone.liberali.ui.custom.menu.MenuItemView.setTitle(MenuItemView.kt:48) 
at com.leavigstone.liberali.ui.activities.MainActivity.onAddButtonClick(MainActivity.java:142) 
at com.leavigstone.liberali.ui.activities.MainActivity_ViewBinding$3.doClick(MainActivity_ViewBinding.java:54) 
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22) 
at android.view.View.performClick(View.java:4780) 
at android.view.View$PerformClick.run(View.java:19866) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5254) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

回答

1

使用Kotterknife爲黃油刀類似查看綁定爲Kotlin。

然後你就可以用

val menuTitleTextView: CTextBasic by bindView(R.id.menu_title_text_view_id) 
-2

你的初始化塊不叫你的視圖綁定。它只在你的主構造函數被調用時被調用。在你的情況下,當從xml佈局創建視圖對象時,使用輔助構造函數。

init{...}塊更改爲fun init(){...},並在每一個構造函數中調用它作爲第一個語句

你忘了添加構造

constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

=>添加它,並在它

+0

當我使用這個(ctx)它說 'MenuItemView'類型的表達式'this'不能作爲一個函數被調用。找不到函數'invoke()' –

+0

我編輯了我的答案 – lukle

+0

謝謝,但同樣的錯誤:/ –

4
調用 init()

如果你不想使用任何第三方庫,你可以添加這些擴展功能(我傾向於有一個ContextExtensions.ktViewExtensions.kt上下文或查看相關擴展功能),然後把它

inline fun <reified T : View> View.find(id: Int): T = findViewById(id) as T 
inline fun <reified T : View> Activity.find(id: Int): T = findViewById(id) as T 
inline fun <reified T : View> Fragment.find(id: Int): T = view?.findViewById(id) as T 

這些讓你從內ActivityFragmentView就到此爲止find。 所以你的類,而不是

@BindView(R.id.menu_title_text_view_id) lateinit var menuTitleTextView : CTextBasic 

裏面,你可以有

val menuTitleTextView by lazy { find<CTextBasic>(R.id.menu_title_text_view_id) } 

類的東西的用戶界面,這是更好地val,而不是var時,他們並不需要改變。作爲編程的一般規則,儘量讓事情儘可能不變,你會得到更少的錯誤。

0

我發現this適合我。

在您的項目app模塊中更改您的build.gradle

dependencies { 
    compile "com.jakewharton:butterknife:8.8.1" 
    kapt "com.jakewharton:butterknife-compiler:8.8.1" 
} 

使用kapt代替annotationProcessor

,然後你可以做你熟悉的ButterKnife註釋是這樣的:

class MainActivity : AppCompatActivity() { 

    @BindView(R.id.myButton) 
    lateinit var myButton: Button 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     ButterKnife.bind(this) 
     //... 
    } 
} 

享受。

相關問題