开源软件名称(OpenSource Name):pawegio/KAndroid开源软件地址(OpenSource Url):https://github.com/pawegio/KAndroid开源编程语言(OpenSource Language):Kotlin 100.0%开源软件介绍(OpenSource Introduction):KAndroidKotlin library for Android providing useful extensions to eliminate boilerplate code in Android SDK and focus on productivity. DownloadDownload latest version with Gradle: allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
dependencies {
implementation 'com.github.pawegio:KAndroid:0.8.7@aar'
} UsageBinding views// instead of findViewById(R.id.textView) as TextView
val textView = find<TextView>(R.id.textView) Accessing ViewGroup children/* instead of:
for (i in 0..layout - 1) {
layout.getChildAt(i).visibility = View.GONE
}
*/
layout.views.forEach { it.visibility = View.GONE } TextWatcher/* instead of:
editText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
before()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
onChange()
}
override fun afterTextChanged(s: Editable?) {
after()
}
}) */
editText.textWatcher {
beforeTextChanged { text, start, count, after -> before() }
onTextChanged { text, start, before, count -> onChange() }
afterTextChanged { text -> after() }
} SearchView extensions/* instead of:
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextChange(q: String): Boolean {
update(q)
return false
}
override fun onQueryTextSubmit(q: String): Boolean {
return false
}
}) */
searchView.onQueryChange { query -> update(query) }
/* instead of:
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextChange(q: String): Boolean {
return false
}
override fun onQueryTextSubmit(q: String): Boolean {
update(q)
return false
}
}) */
searchView.onQuerySubmit { query -> update(query) } SeekBar extension/* instead of:
seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onStopTrackingTouch(seekBar: SeekBar) {
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
}
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
mediaPlayer.seekTo(progress)
}
}) */
seekBar.onProgressChanged { progress, fromUser ->
if (fromUser) mediaPlayer.seekTo(progress)
} Using system services// instead of getSystemService(Context.WINDOW_SERVICE) as WindowManager?
windowManager
// instead of getSystemService(Context.POWER_SERVICE) as PowerManager?
powerManager
// instead of getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?
notificationManager
// instead of getSystemService(Context.USER_SERVICE) as UserManager?
userManager
// etc. Toast messageslongToast("I'm long toast message!")
toast("Hi, I'm short one!")
longToast(R.string.my_string)
toast(R.string.my_string) Layout inflater// instead of LayoutInflater.from(context).inflate(R.layout.some_layout, null, false)
context.inflateLayout(R.layout.some_layout)
// or
context.inflateLayout(R.layout.some_layout, attachToRoot = true) Using Intents// instead of Intent(this, javaClass<SampleActivity>())
val intent = IntentFor<SampleActivity>(this)
// instead of startActivity(Intent(this, javaClass<SampleActivity>()))
startActivity<SampleActivity>()
// instead of startActivityForResult(Intent(this, javaClass<SampleActivity>()), REQUEST_CODE)
startActivityForResult<SampleActivity>(REQUEST_CODE) Logging// using javaClass.simpleName as a TAG
w("Warn log message")
e("Error log message")
wtf("WTF log message")
// using lambda log method
v { "Verbose log message" }
d { "Debug log message" }
i { "Info log message" }
// or with custom TAG
v("CustomTag", "Verbose log message with custom tag") Threading// instead of Thread(Runnable { /* long execution */ }).start()
runAsync {
// long execution
}
// delayed run (e.g. after 1000 millis)
// equals Handler().postDelayed(Runnable { /* delayed execution */ }, delayMillis)
runDelayed(1000) {
// delayed execution
}
// run on Main Thread outside Activity
// equals Handler(Looper.getMainLooper()).post(Runnable { /* UI update */ })
runOnUiThread {
// UI update
}
// delayed run on Main Thread
// equals Handler(Looper.getMainLooper()).postDelayed(Runnable { /* delayed UI update */ }, delayMillis)
runDelayedOnUiThread(5000) {
// delayed UI update
} From/To API SDK// instead of if (Build.VERSION.SDK_INT >= 21) { /* run methods available since API 21 */ }
fromApi(21) {
// run methods available since API 21
}
// instead of if (Build.VERSION.SDK_INT < 16) { /* handle devices using older APIs */ }
toApi(16) {
// handle devices running older APIs
}
// or
// instead of if (Build.VERSION.SDK_INT <= 16) { /* handle devices using older APIs */ }
toApi(16, inclusive = true) {
// handle devices running older APIs
} Loading animation from xml// instead of AnimationUtils.loadAnimation(applicationContext, R.anim.slide_in_left)
loadAnimation(R.anim.slide_in_left) Animation listener/*instead of:
animation.setAnimationListener(object : Animation.AnimationListener{
override fun onAnimationStart(animation: Animation?) {
onStart()
}
override fun onAnimationEnd(animation: Animation?) {
onEnd()
}
override fun onAnimationRepeat(animation: Animation) {
onRepeat()
}
})*/
animation.animListener {
onAnimationStart { onStart() }
onAnimationEnd { onEnd() }
onAnimationRepeat { onRepeat() }
} Web intents with url validation// instead of Intent(Intent.ACTION_VIEW, Uri.parse("http://github.com"))
WebIntent("http://github.com") MoreUnder development so expect soon. Apps using KAndroid(contact me or create new pull request to add your apps) License
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论