Comments (2)
Thank you for your suggestion!
It is very interesting to me! If you can, please share your solution!!
from kotpref.
What I would try to do is not (yet) possible, although via reflection it should be...
All that is missing to get something like this working is following:
- a way to get a
KotprefModule
by name - a way to iterate all preferences inside a module
Then all default types like a string, boolean, int and so on should work.
Codes
Be aware, this is just something to start with - it's something that works for a very simply new littke app I wrote recently. Basically it looks like following:
-
a very simply reusable activity
class KotprefPreferenceActivity : AppCompatActivity() { companion object { fun show(activity: AppCompatActivity) { activity.startActivity(Intent(activity, KotprefPreferenceActivity::class.java)) } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportActionBar?.setTitle(R.string.settings) // TODO: get name from KotprefModule val tag = KotprefPreferenceFragment::class.java.name val fragment = fragmentManager.findFragmentByTag(tag) if (fragment == null) { val prefsFragment = KotprefPreferenceFragment.create( "Prefs", // TODO: get name from KotprefModule Context.MODE_PRIVATE // TODO: get mode from KotprefModule ) fragmentManager .beginTransaction() .replace(android.R.id.content, prefsFragment, tag) .commit() } } }
-
the preference fragment
class KotprefPreferenceFragment : PreferenceFragment() { companion object { const val KEY_NAME = "name" const val KEY_MODE = "mode" fun create(sharedPreferenceName: String, sharedPreferenceMode: Int): KotprefPreferenceFragment { val fragment = KotprefPreferenceFragment() val args = Bundle().apply { putString(KEY_NAME, sharedPreferenceName) putInt(KEY_MODE, sharedPreferenceMode) } fragment.arguments = args return fragment } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) preferenceManager.sharedPreferencesName = arguments.getString(KEY_NAME) preferenceManager.sharedPreferencesMode = arguments.getInt(KEY_MODE) } override fun onDestroy() { // if KotprefModule would support internal caching, we would need to invalidate cache here! super.onDestroy() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { val screen = getPreferenceManager().createPreferenceScreen(activity) // 1) get correct kotpref object // 2) get list of preferences AND categories from kotpref // 3) iterate over list like e.g. following: I assume that type of field is a class, could be an attribute or whatever as well -> would need to be added // val parent: Any = screen // for (item in items) { // when (item) { // is KotprefCategory -> parent = addCategory(screen, item.title) // is KotprefBool -> addBoolean(item.key, item.title, item.summary, item.value) // ... TODO ... // } // } // Manual way addBoolean( "startAppOnProfileChange", R.string.pref_auto_start_app_on_profile_change, R.string.pref_auto_start_app_on_profile_change_summary, Prefs.startAppOnProfileChange, screen ) addBoolean( "newProfileIsCopyOfFirst", R.string.pref_new_profile_is_copy_of_first, R.string.pref_new_profile_is_copy_of_first_summary, Prefs.newProfileIsCopyOfFirst, screen ) // set preference screen preferenceScreen = screen } // ---------------- // functions // ---------------- private fun addCategory(screen: PreferenceScreen, title: Int): PreferenceCategory { val category = PreferenceCategory(activity) category.title = getString(title) screen.addPreference(category) return category } private fun addBoolean(key: String, title: Int, summary: Int, value: Boolean, parent: Any) { val checkBoxPref = CheckBoxPreference(activity) checkBoxPref.key = key checkBoxPref.title = activity.getString(title) checkBoxPref.summary = activity.getString(summary) checkBoxPref.isChecked = value addPreference(checkBoxPref, parent) } private fun addPreference(preference: Preference, parent: Any) { when (parent) { is PreferenceScreen -> parent.addPreference(preference) is PreferenceCategory -> parent.addPreference(preference) } } }
-
my example Kotpref module
object Prefs : KotprefModel() { var startAppOnProfileChange by booleanPref(true) var newProfileIsCopyOfFirst by booleanPref(false) }
from kotpref.
Related Issues (20)
- KotPref + applicationIdSuffix not working HOT 2
- Crash on latest library version if I compose delegates HOT 7
- How is proguard and code obfuscation solved? HOT 1
- unit test with viewModels uses kotpref HOT 1
- Add support for EncryptedSharedPreferences HOT 2
- Clear() does not work with EncryptedSharedPreferences HOT 4
- Auto update API docs with CI
- When mocking, the values are not initialized and mock returns default HOT 2
- create a new XXXPref object every time,can the same object be used? HOT 1
- Do you plan to support Jetpack DataStore? HOT 1
- LiveData - fires twice upon first subscription HOT 1
- if I using moshi, is it good idea to serialize model with moshi and save by stringPref? HOT 1
- Change value type HOT 1
- Migrate from JCenter to Maven Central HOT 3
- If a key is composed of fixed + dynamic parts, what to do? HOT 2
- How to migrate to DataStore? HOT 2
- Codecov uploader don't work after dependencies update
- NPE on livedata-support when calling clear()
- livedata is not notify when clearing on API < 30
- Featur Request -> Save data class HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kotpref.