рдпрд╣ рд▓реЗрдЦ рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдЪреАрдиреА рдХреНрдпреВрдмреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬреЛ рдореИрдВ рдирд┐рдпрдд рд╕рдордп рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░ рдЬреЛ рдХрд╛рдо рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЖрджрд░реНрд╢ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЙрд╕реА рддрд░рд╣ рдЖрдкрдХреЗ рдХрд╛рдо рдЖ рд╕рдХрддреА рд╣реИрдВ, рдЬрдм рд╡реЗ рдПрдХ рд╕рдордп рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдереАрдВред
рдЖрд╡реЗрджрди рдФрд░ рдЯреЛрд╕реНрдЯ
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддреА рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЖрд╡реЗрджрди рдХреА рдПрдХ рдХрдбрд╝реА рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рд▓рд┐рдВрдХ рдХреЛ AndroidManifest рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
class App : Application() { init { APP = this } companion object { lateinit var APP: App } }
рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдореЗрд╢рд╛ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдк рдХрд╣реАрдВ рд╕реЗ рднреА рд▓рд╛рдЗрдиреЗрдВ / рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдХрдо рд╕реЗ рдХрдо рдЪреАрдиреА рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдирд╛рдЬ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
fun Toast(messageId: Int) { Toast.makeText(App.APP, messageId, Toast.LENGTH_LONG).show() } fun Toast(message: String) { Toast.makeText(App.APP, message, Toast.LENGTH_LONG).show() }
рдПрдХ рддрд┐рдкрд╣рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреЛрдЯрд▓рд┐рди рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдЕрдм рдЖрдк рд╢реАрдШреНрд░ рд╣реА рдЯреЛрд╕реНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рдХрдВрдлрд░реНрдЯреЗрдмрд▓ рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд░ рдЬрдЧрд╣ рд╕реБрд▓рдн рд╣реЛрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд░реВрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдХреНрд░реАрди рдкрд░ рдХреМрди рд╣реИ?
рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП, рдХрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХрдо рд╕реЗ рдХрдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рддрд░реНрдХ рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдордп рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ рдФрд░ рдпрд╣ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдХреНрдпрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдХреЗрд▓ рдореЗрдВ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдмрд╛рддреЗрдВ рдкрд╣рд▓реЗред рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ APP рдореВрд▓реНрдп рдЕрдХреЗрд▓реЗ рдКрдм рди рдЬрд╛рдП, рдХрдВрдкрдиреА рдЙрд╕реЗ рдмрдирд╛рдПрдЧреА:
var screenActivity: AppCompatActivity? = null var onScreen: Boolean = false
рдФрд░ рдлрд┐рд░, рд╣рдо рдЕрдкрдирд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ AppCompatActivity рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ:
open class BaseActivity : AppCompatActivity() { override fun onStart() { super.onStart() App.onScreen = true } override fun onStop() { super.onStop() if (App.screenActivity == this) { App.onScreen = false if (isFinishing()) App.screenActivity = null } } override fun onDestroy() { super.onDestroy() if (App.screenActivity == this) App.screenActivity = null } override fun onCreate(savedInstanceState: Bundle?) { App.screenActivity = this } override fun onRestart() { super.onRestart() App.screenActivity = this } }
рд╣рд╛рдВ, рдирдП рдорд╛рд░реНрдЧрджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЬреАрд╡рдирдЪрдХреНрд░ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИред
рд╕реНрдерд╛рдиреАрдпрдХреГрдд рддрд╛рд░
рд╕рдВрджрд┐рдЧреНрдз рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреАрдХреЗ рдЯреАрдХреЗ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рднрд╛рд╖рд╛ рдХреА рдкрд╕рдВрдж рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреВрдВрдЧрд╛ред рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рдмрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдЧ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЗрди рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ, рддреЛ рд▓рд╛рдЗрди рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдХреЗрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред рдФрд░ рдХрд┐рд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдлреЗрдВрдХрдирд╛ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрдП:
fun getRes(): Resources = screenActivity?.resources ?: APP.resources fun getLocalizedString(stringId: Int): String = getRes().getString(stringId) fun getLocalizedString(stringId: Int, vararg formatArgs: Any?): String = getRes().getString(stringId, *formatArgs)
рдФрд░ рдЕрдм рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рд╣рдо рд╕рд╣реА рд▓реЛрдХреЗрд▓ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
SharedPreferences
рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдХреБрдЫ рд╕рд╛рдЭрд╛рдХрд░рдгреЛрдВ рдореЗрдВ рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреА рд╣реЛрддреА рд╣реИрдВред рдФрд░ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рддрд░реНрдХ рдЫрд┐рдкрд╛рддрд╛ рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреАрдкреА рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рджреЛрд╕реНрдд рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:
lateinit var settings: SharedPreferences
рдпрд╣ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИред
class PreferenceString(val key: String, val def: String = "", val store: SharedPreferences = App.settings, val listener: ModifyListener? = null) { var value: String get() { listener?.customGet() return store.getString(key, def) ?: def } set(value) { store.edit().putString(key, value).apply() listener?.customSet() } } interface ModifyListener { fun customGet() {} fun customSet() {} }
рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдХрдХреНрд╖рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЖрдк рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
val PREF_LANGUAGE = PreferenceString("pref_language", "ru")
рдФрд░ рдЕрдм рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╢реНрд░реЛрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ / рдмрдЪрдд рдФрд░ рд╕рдВрдЪрд╛рд░ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдФрд░ рдЯреИрдмрд▓реЗрдЯ
рдХреНрдпрд╛ рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рдЭреБрдХрд╛рд╡реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ? рдФрд░ рдЖрдкрдиреЗ рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдЕрдм рдЖрдк рдХрд┐рд╕ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╣реИрдВ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд╣реАрдВ рд╕реЗ рднреА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ:
fun isLandscape(): Boolean { return getRes().configuration.orientation == Configuration.ORIENTATION_LANDSCAPE }
рдпрджрд┐ рдЖрдк рдорд╛рди / dimen.xml рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ:
<bool name="isTablet">false</bool>
рдФрд░ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ-рдмрдбрд╝реЗ / рдбрд┐рдореЗрдиред Xml:
<bool name="isTablet">true</bool>
рдлрд┐рд░ рдЖрдк рдПрдХ рд╡рд┐рдзрд┐ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
fun isTablet(): Boolean { return getRes().getBoolean(R.bool.isTablet) }
DateFormat
рдмрд╣реБ рд╕реВрддреНрд░рдгред рдХрднреА-рдХрднреА рдпрд╣ рдПрдХ рдбрд░рд╛рд╡рдирд╛ рд╢рдмреНрдж рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рддрд╛рд░реАрдЦреЛрдВ рдХреА рд░реЗрдЦрд╛рдПрдБ рдмрдирд╛рдИрдВ рддреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдмрдЧ рдкрдХрдбрд╝рд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ SimpleDateFormat рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ:
class ThreadSafeDateFormat(var pattern: String, val isUTC: Boolean = false, val locale: Locale = DEFAULT_LOCALE){ val dateFormatThreadLocal = object : ThreadLocal<SimpleDateFormat>(){ override fun initialValue(): SimpleDateFormat? { return SimpleDateFormat(pattern, locale) } } val formatter: SimpleDateFormat get() { val dateFormat = dateFormatThreadLocal.get() ?: SimpleDateFormat(pattern, locale) dateFormat.timeZone = if (isUTC) TimeZone.getTimeZone("UTC") else timeZone return dateFormat } }
рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг (рд╣рд╛рдБ, рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЕрдВрджрд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
private val utcDateSendSafeFormat = ThreadSafeDateFormat("yyyy-MM-dd", true) val utcDateSendFormat: SimpleDateFormat get() = utcDateSendSafeFormat.formatter
рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдФрд░ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
TextWatcher
рдФрд░ рдЖрдкрдиреЗ рдХрднреА рднреА рдпрд╣ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ EditText рдореЗрдВ рдХреМрди рд╕рд╛ рдЯреЗрдХреНрд╕реНрдЯ рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ TextWatcher рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ 3 (!) рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╕рдм рдХреБрдЫ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
open class TextWatcherObject : TextWatcher{ override fun afterTextChanged(p0: Editable?) {} override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} }
рдХреАрдмреЛрд░реНрдб
рдХреНрдпрд╛ рд╣рдореЗрд╢рд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдкрдХреЛ рддреБрд░рдВрдд рдХреАрдмреЛрд░реНрдб рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рд░реВрдЯ рджреГрд╢реНрдп рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
fun showKeyboard(view: EditText){ view.requestFocus(); (App.APP.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?) ?.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY) } fun hideKeyboardFrom(view: View) { (App.APP.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?) ?.hideSoftInputFromWindow(view.windowToken, 0) }
рдФрд░, рд╢рд╛рдпрдж рдХреЛрдИ рдХрд╛рдо рдЖрдПрдЧрд╛, рдЯреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрди рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп:
fun String.toClipboard(toast: Int) { val clip = ClipData.newPlainText(this, this) (App.APP.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?)?.setPrimaryClip(clip) Toast(toast) }
RecyclerView рдФрд░ TableLayout
рдФрд░ рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд╡рд╣реА рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╣рд▓ рдХрд░рдирд╛ рдерд╛ред рд╢рд╛рдпрдж рдХреЛрдИ рдХрд╛рдо рдЖрдПрдЧрд╛ред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 1k + рдбреЗрдЯрд╛ред
- рдкреНрд░рддреНрдпреЗрдХ "рд╕реЗрд▓" рдореЗрдВ рд▓рдЧрднрдЧ 10 рдХреНрд╖реЗрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВред
- рдпрд╣ рдЬрд╝реЛрд░ рд╕реЗ рдорд╛рд░рдирд╛, рдХреНрд▓рд┐рдХ рдХрд░рдирд╛, рдбрдмрд▓ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛, рд▓реЙрдиреНрдЧ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
- рдФрд░ ... рдбреЗрдЯрд╛ рд╣рд░ 300 рд╕реЗ 500 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд░ рдЖрдк рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рддрдм рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЯреЗрдмрд▓рд▓реИрдЯрдЖрдЙрдЯред рдХреНрдпреЛрдВ рдирд╣реАрдВ RecyclerView? рдФрд░ 3 рдФрд░ 4 рдЕрдВрдХ рдХреЗ рдХрд╛рд░рдгред рд╢реАрдЯ рдХреЗ рдЕрдВрджрд░ рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ рдФрд░ рдпрд╣ рджреГрд╢реНрдп рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВред рдФрд░ рдПрдХ рдирдпрд╛ рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╕рдордп, рдЯрдЪ рд╣реИрдВрдбрд▓рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрд╡рд╛рдЗрдк рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордп-рд╕рдордп рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЯреИрдк рд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рд╡реНрдпреВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рднреА рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рди рд╣реА рд╕реВрдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдЗрд╕рд▓рд┐рдП, TableLayout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛, рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛ 100 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдерд╛ред рдФрд░ рдлрд┐рд░ - рдлреНрд░реАрдЬ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдореИрдВрдиреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рддрд░реАрдХреЗ рджреЗрдЦреЗ - рдпрд╛ рд╕реЗрд▓реНрдпреВрд▓ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЬрд╛рджреВ рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╛ рджреЛрд╕реНрддреЛрдВ рдХреЛ RecyclerView рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдФрд░ рдореИрдВ рджреВрд╕рд░реЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдЧрдпрд╛ред рдЪреВрдВрдХрд┐ рдЯрдЪ рдФрд░ рд╕реНрд╡рд╛рдЗрдк (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реНрд╡рд╛рдЗрдк рдХреЗ рдХрд╛рд░рдг) View.OnTouchListener рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рдпрд╣ рдбрд┐рд╕реНрдкреИрдЪрдЪреЙрдЗрд╡реЗрдВрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЯрдЪ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг рд╕реНрддрд░ рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдирд┐рдХрд▓рд╛ред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реИ:
- рд╕реНрдкрд░реНрд╢ рдХреЛ рдкрдХрдбрд╝реЗрдВ
- рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЯрдЪрдЪреИрд▓реНрдб рд╡реНрдпреВрдЙрдВрдбрд░ (x, y) рдХреЗ рд╕рд╛рде рдХреМрди рд╕рд╛ рдмрдЪреНрдЪрд╛ рдЙрдбрд╝ рд░рд╣рд╛ рд╣реИ
- рд▓реЗрдЖрдЙрдЯрдореИрди рд╕реЗ рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рдпрджрд┐ рдпрд╣ MotionEvent.ACTION_MOVE рд╣реИ, рддреЛ рд╣рдо рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ
- рд╕реНрдкрд░реНрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбреЗрдб рддрд░реНрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВ
рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рд╕реЗ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдлрд┐рд▓рд╣рд╛рд▓ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред