Skip to content

Instantly share code, notes, and snippets.

@Yazon2006
Created February 20, 2018 07:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Yazon2006/dec36256f6973fa656cdba29b34be077 to your computer and use it in GitHub Desktop.
Save Yazon2006/dec36256f6973fa656cdba29b34be077 to your computer and use it in GitHub Desktop.
Frgment arg helper
/**
* Eases the Fragment.newInstance ceremony by marking the fragment's args with this delegate
* Just write the property in newInstance and read it like any other property after the fragment has been created
*
* Inspired by Jake Wharton, he mentioned it during his IO/17 talk about Kotlin
*/
class FragmentArg<T : Any?> : kotlin.properties.ReadWriteProperty<Fragment, T?> {
var value: T? = null
override operator fun getValue(thisRef: android.support.v4.app.Fragment, property: kotlin.reflect.KProperty<*>): T {
if (value == null) {
val args = thisRef.arguments ?: throw IllegalStateException("Cannot read property ${property.name} if no arguments have been set")
@Suppress("UNCHECKED_CAST")
value = args.get(property.name) as T
}
return value ?: throw IllegalStateException("Property ${property.name} could not be read")
}
override operator fun setValue(thisRef: android.support.v4.app.Fragment, property: kotlin.reflect.KProperty<*>, value: T?) {
if (thisRef.arguments == null) thisRef.arguments = android.os.Bundle()
val args = thisRef.arguments
val key = property.name
when (value) {
is String -> args?.putString(key, value)
is Int -> args?.putInt(key, value)
is Short -> args?.putShort(key, value)
is Long -> args?.putLong(key, value)
is Byte -> args?.putByte(key, value)
is ByteArray -> args?.putByteArray(key, value)
is Char -> args?.putChar(key, value)
is CharArray -> args?.putCharArray(key, value)
is CharSequence -> args?.putCharSequence(key, value)
is Float -> args?.putFloat(key, value)
is Bundle -> args?.putBundle(key, value)
is Binder -> args?.let { BundleCompat.putBinder(it, key, value) }
is android.os.Parcelable -> args?.putParcelable(key, value)
is java.io.Serializable -> args?.putSerializable(key, value)
else -> throw IllegalStateException("Type of property ${property.name} is not supported")
}
}
}
@Yazon2006
Copy link
Author

Yazon2006 commented Feb 20, 2018

    private var filterId by FragmentArg<Long>()

    companion object {
        fun newInstance(filterId: Long = ABSENT_ID) = ThisFragment().apply {
            this.filterId = filterId
        }
    }

@Holoceo
Copy link

Holoceo commented Feb 20, 2018

Thanks for sharing. It's beautiful) You should definitely make a pull request to android ktx.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment