Skip to content

Instantly share code, notes, and snippets.

@M-Miyazako
M-Miyazako / ImageViewExt.kt
Last active January 17, 2020 01:10
# URLから画像を非同期で読み込む 要RxJava
fun ImageView.asyncLoadBitmapFromUrl(url: URL) {
Observable.create<Bitmap> { emitter ->
emitter.onNext(BitmapFactory.decodeStream(url.openStream()))
emitter.onComplete()
}
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { setImageBitmap(it) }
}
@M-Miyazako
M-Miyazako / IntExt.kt
Last active January 16, 2020 08:30
# pxとdpの相互変換
val Int.dpToPx: Int get() = (this * Resources.getSystem().displayMetrics.density + 0.5f).toInt()
val Int.pxToDp: Int get() = (this / Resources.getSystem().displayMetrics.density + 0.5f).toInt()
@M-Miyazako
M-Miyazako / ViewExt.kt
Last active January 16, 2020 08:31
# Viewのサイズが取得できるようになったタイミングで通知
inline fun <T : View> T.afterMeasured(crossinline func: T.() -> Unit) {
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (measuredWidth > 0 && measuredHeight > 0) {
viewTreeObserver.removeOnGlobalLayoutListener(this)
func()
}
}
})
}
@M-Miyazako
M-Miyazako / Result.kt
Last active January 17, 2020 01:10
# APIの通信中にプログレスバーを表示する 要RxJava&Lifecycles
sealed class Result<T> {
class InProgress<T> : Result<T>()
data class Success<T>(var data: T) : Result<T>()
data class Failure<T>(val e: Throwable) : Result<T>()
companion object {
fun <T> inProgress(): Result<T> = InProgress()
fun <T> success(data: T): Result<T> = Success(data)
fun <T> failure(e: Throwable): Result<T> = Failure(e)
}
@M-Miyazako
M-Miyazako / ActivityExt.kt
Created January 17, 2020 00:36
# Fragmentの画面遷移
fun AppCompatActivity.replace(fragment: Fragment, isBackStack: Boolean = false) {
val transaction = supportFragmentManager
.beginTransaction()
.replace(R.id.content, fragment)
if (isBackStack) {
transaction.addToBackStack(null)
}
if (supportFragmentManager.isStateSaved) {
@M-Miyazako
M-Miyazako / SquareImageView.kt
Created January 17, 2020 00:55
# 正方形のImageView
class SquareImageView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ImageView(context, attrs, defStyleAttr) {
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
setMeasuredDimension(measuredWidth, measuredWidth)
}
@M-Miyazako
M-Miyazako / RxViewModel.kt
Created January 17, 2020 01:10
# RxJava使用時のViewModel 要RxJava&LifeCycles
open class RxViewModel : ViewModel() {
protected val compositeDisposable = CompositeDisposable()
override fun onCleared() {
super.onCleared()
compositeDisposable.clear()
}
}
@M-Miyazako
M-Miyazako / ListItem.kt
Last active January 20, 2020 06:39
# Groupieことはじめ 要Groupie&DataBinding
class ListItem(private val text: String): BindableItem<ItemListBinding>() {
override fun getLayout(): Int = R.layout.item_list
override fun bind(viewBinding: ItemListBinding, position: Int) {
viewBinding.text = text
}
}
@M-Miyazako
M-Miyazako / Usage.kt
Last active January 20, 2020 08:27
# KotlinのJsonパーサはkotshiが良いらしい * Gson -> not nullの変数にnullを入れてしまうことがある * moshi -> 安全だがリフレクションを使っているので遅い * kotshi -> リフレクションを使わないmoshiのアダプターを生成 = 早くて安全 参考:https://blog.kaelae.la/entry/2018/01/29/203000
fun parse_person() {
val json = "{\"name\": \"kaelaela\", \"email\": \"test@gmail.com\", \"job_title\": \"title\", \"age\": 27}"
val moshi = Moshi.Builder().add(ApplicationJsonAdapterFactory.INSTANCE).build()
val person = moshi.adapter<Person>(Person::class.java).fromJson(json)
}
@JsonSerializable
data class Person(
val name: String,
val email: String?,
// 指定URLから画像を読み込み、セットする
// defaultUIImageには、URLからの読込に失敗した時の画像を指定する
extension UIImageView {
func loadImageAsynchronously(url: URL?, defaultUIImage: UIImage? = nil) -> Void {
if url == nil {
self.image = defaultUIImage
return
}