FString provides an elegant solution for dynamically updating the strings.xml values. It uses a combination of Android SharedPreferences, strings.xml and reflections to dynamically update the values in SharedPreferences. By using FString, strings.xml existing value can be updated using JSON string without releasing a new version.
FString stores the updated values in the SharedPreferences (as we can not update strings.xml directly). FString first checks the value in the SharedPreferences otherwise it returns the default value from the strings.xml
- In your project's module build.gradle add this dependency
implementation 'com.ravindrabarthwal.fstring:fstring:1.0.1'
- In your Android Application class add the following code
import com.example.myapp.R.string as RString // Import your string class MyApp: Application() { override fun onCreate() { super.onCreate() FString.init(RString::class.java) // Initializes the FString } }
To access the strings
// This is how you get strings without FString
context.getString(R.string.my_app_name) // This is how you normally do
// To get the string using FString use
FString.getString(context, R.string.my_app_name)
// If you prefer extension function use
context.getFString(R.string.my_app_name) // This is how FString works ;)
// String with formatting args
// Eg. For StringRes <string name="my_app_version">MyApp %s</string>
context.getString(R.string.my_app_version, "v1.0") // This is how you normally use getString with args
// To get the same using FString use
FString.getString(context, R.string.my_app_version, listOf("v1.0"))
// If you prefer extension function use
context.getFString(R.string.my_app_version, listOf("v1.0"))
To update the FString values
/*
* Assume this JSON is coming from server. The JSON string
* must be parseable to a JSON object with key and value pairs
*/
var jsonFromServer = """
{
"my_app_name": "MyApp v2.0",
"some_other_string": "this is so cool",
}
""".trimIndent()
// This will update the SharedPreference using keys from
// above JSON and corresponding value. The SharedPreference will
// not save any key that is not is strings.xml
FString.update(context, jsonFromServer)
To clear values
/*
* If you want to clear some keys' value to default, either update
* the FString with previous values or use the below api
*/
// To clear all values
FString.clearAll(context)
// To clear specific values send JSON String that must be
// parseable to a JSONArray containing the keys to clear
val jsonToClear = """
[
"my_app_name"
]
""".trimIndent()
FString.clear(context, jsonToClear)
All TODOs Fixed
Feel free to fork it and create a pull request.
You can support this project by clicking on star on top right. 🙏
Made with ❤ at Mouve - Animated Stories Creator for Instagram