2017-08-30 48 views
2

這是我的代碼。正如你所看到的適用體是完全一樣的。有比使用擴展功能更好的嗎?如何在Kotlin中將.apply中的重複語句分組?

contentText?.let { 
    contentTextView?.apply { 
     visibility = View.VISIBLE 
     text = contentText 
    } 
} 

titleText?.let { 
    titleTextView?.apply { 
     visibility = View.VISIBLE 
     text = titleText 
    } 
} 

這裏是我的功能

private fun setTextAndVisiblity(textView: TextView?, newText: String?): TextView? { 
    return textView?.apply { 
     visibility = View.VISIBLE 
     text = newText 
    } 
} 

這是我的代碼時,應用功能

contentText?.let { 
    setVisibleText(contentTextView, it) 
} 

titleText?.let { 
    setVisibleText(titleTextView, it) 
} 
+1

如果你沒有聲明它是本地的(我看你沒有,因爲private關鍵字),你的擴展函數shoud接收contextText作爲參數。並且該聲明必須被稱爲'theTextView.setVisibleText(theText)' – crgarridos

+0

好點,謝謝。但是,我宣佈它是本地的。 – UmAnusorn

回答

2

我會寫的擴展功能是這樣的:

fun TextView.setVisibleIfTextNotNull(text: CharSequence?) = text?.let { 
    visibility = View.VISIBLE 
    this.text = it 
} 

用法:

contentTextView?.setVisibleIfTextNotNull(contentText) 
titleTextView?.setVisibleIfTextNotNull(titleText) 

您可以使其作爲一個嵌套的函數或私人擴展功能,只要你喜歡。函數的名稱可能不夠清楚,無法說明函數的功能,您可能會想到更好的函數。

+0

爲什麼你使用CharSequence而不是String? – UmAnusorn

+1

@umitems因爲TextView的'text'類型是'CharSequence'。使用'CharSequence',你可以使用['SpannableString']](https://developer.android.com/reference/android/text/SpannableString.html)來構建一些樣式文本。 – BakaWaii

1

的擴展功能似乎是最好的選擇。如果你使這個函數返回this,你可以不加適用地使用它。

您的其他選擇是創建一個普通函數,並使用方法引用將其傳遞到also

fun setVisibleText(view: View) { } 
titleTextView.also(this::setVisibleText) 
1

最乾淨的,我是要申報的擴展功能:

fun TextView.setVisibleWithText(text: String?){ 
    text ?: return 
    visibility = View.VISIBLE 
    setText(text) 
} 

然後調用它:

myTextView?.setVisibleWithText(myText) 

無論如何,請記住,一個擴展功能,它只是一個靜態UTIL功能。 下面這個函數:

fun TextView.setVisibleWithText(text: String){ 
    visibility = View.VISIBLE 
    setText(text) 
} 

將成爲這樣的事情在Java:

class TextViewKt { 
    public static function setVisibleWithText(@NotNull TextView receiver, @NotNull String text){ 
    receiver.visibility = View.VISIBLE 
    receiver.setText(text) 
    } 
} 

而且之後就可以稱其爲:

theText?.let { theTextView?.setVisibleWithText(it) } 

您可以隨時申報正常funtion作爲:

fun setVisibleWithText(textView: TextView, text: String){ 
     textView.visibility = View.VISIBLE 
     textView.text = text 
    } 

,或者如果你想裏面的檢查:

/*** 
    * It makes the textview visible if text is not null (it will stay visible if it was visible before) 
    **/ 
    fun setVisibleWithText(textView: TextView, text: String?){ 
     text ?: return 
     textView.visibility = View.VISIBLE 
     textView.text = text 
    }