{"id":13498321,"url":"https://github.com/jelic98/dynamico","last_synced_at":"2025-03-29T01:30:23.713Z","repository":{"id":110817599,"uuid":"128483100","full_name":"jelic98/dynamico","owner":"jelic98","description":"Android library for inflating dynamic layouts in runtime based on JSON configuration fetched from server","archived":false,"fork":false,"pushed_at":"2020-11-20T10:50:21.000Z","size":243,"stargazers_count":45,"open_issues_count":5,"forks_count":22,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-10-31T15:38:45.912Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jelic98.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-04-07T00:26:38.000Z","updated_at":"2024-09-28T12:45:14.000Z","dependencies_parsed_at":"2024-01-18T23:04:44.414Z","dependency_job_id":"860a714d-e991-42b6-86d0-6325fc3757a7","html_url":"https://github.com/jelic98/dynamico","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelic98%2Fdynamico","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelic98%2Fdynamico/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelic98%2Fdynamico/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelic98%2Fdynamico/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jelic98","download_url":"https://codeload.github.com/jelic98/dynamico/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246125321,"owners_count":20727408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T21:00:22.068Z","updated_at":"2025-03-29T01:30:23.405Z","avatar_url":"https://github.com/jelic98.png","language":"Java","funding_links":[],"categories":["Uncategorized"],"sub_categories":["Uncategorized"],"readme":"[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![](https://jitpack.io/v/jelic98/dynamico.svg)](https://jitpack.io/#jelic98/dynamico)\n[![API](https://img.shields.io/badge/API-19%2B-orange.svg?style=flat)](https://android-arsenal.com/api?level=19)\n[![Android Arsenal]( https://img.shields.io/badge/Android%20Arsenal-Dynamico-brightgreen.svg?style=flat)]( https://android-arsenal.com/details/1/6926)\n\n# Dynamico\n\nAndroid library for inflating dynamic layouts in runtime based on JSON configuration fetched from server. Useful in situations when layouts need to change without updating the app.\n\n## Advanced features\n\n* Targeting specific devices by brand, model and Android API version\n* Layout changes based on configuration fields\n\n## Installing\n\n1. Add repository in root ```build.gradle```\n\n```gradle\nallprojects {\n    repositories {\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\n2. Add the dependency\n\n```gradle\ndependencies {\n    compile 'com.github.jelic98:dynamico:1.2.0'\n}\n```\n\n## Usage\n\n1. Create JSON layout and upload it somewhere\n\n```json\n{\n  \"views\":[  \n    {  \n      \"class\":\"android.widget.ImageView\",\n      \"attributes\":{  \n        \"layout_width\":\"wrap_content\",\n        \"layout_height\":\"wrap_content\",\n        \"src\":\"https://lazarjelic.com/ecloga/projects/dynamico/logo.png\",\n        \"cache\":true\n      }\n    },\n    {  \n      \"class\":\"android.widget.TextView\",\n      \"attributes\":{  \n        \"text\":\"Yo!\",\n        \"textColor\":\"#FF69B4\"\n      }\n    }\n  ]\n}\n```\n\n2. Create XML wrapper layout that will contain loaded views\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cLinearLayout\n\txmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"match_parent\"\n\tandroid:orientation=\"vertical\"\n\tandroid:id=\"@+id/mainLayout\"\u003e\n\t\t\n\t\u003c!-- Dynamic content will be added here --\u003e\n\u003c/LinearLayout\u003e\n```\n\n3. Initialize Dynamico by passing it:\n* URL = Link to JSON layout **directory**\n* name = Name of JSON layout **file**\n* layout = Wrapper layout that will contain loaded views\n\n```java\nnew Dynamico(\"https://lazarjelic.com/ecloga/projects/dynamico\",\n    \"activity_main\",\n    findViewById(R.id.mainLayout))\n    .initialize();\n```\n\n## Manual\n\nFor advanced usage, take a look at this awesome [manual](https://github.com/jelic98/dynamico/blob/master/MANUAL.md).\n\n## Additional features\n\n* Event listener\n\n```java\nsetListener(new LayoutStateListener() {\n\t@Override\n\tpublic void onSuccess(String message) {\n\t\t// everything is okay\n\t}\n\t\n\t@Override\n\tpublic void onError(String message) {\n\t\t// notify user\n\t}\n})\n```\n\n* Loading from cache (skip layout fetching from server)\n\n```java\nsetOptions(CACHE_ONLY)\n```\n\n* Non-stop layout fetching\n\n```java\nsetOptions(NON_STOP) // use with setAsyncPause(long millis)\n```\n\n## Documentation\n\n###### `public Dynamico(String url, String name, ViewGroup layout) throws DynamicoException`\n\nOne and only constructor\n\n * **Parameters:**\n   * `url` — URL of directory where JSON layout file is located (for example, \"https://lazarjelic.com/ecloga/projects/dynamico\")\n   * `name` — JSON layout file name with or without extension (for example, \"activity_main\")\n   * `layout` — wrapper layout that will contain inflated layout from JSON file (for example, findViewById(R.id.mainLayout))\n * **Exceptions:** `DynamicoException` — if any of passed parameters is null\n\n###### `public Dynamico setListener(DynamicoListener listener)`\n\nAttaches event listener to Dynamico object\n\n * **Parameters:** `listener` — listener for success and error events caused by network, storage, etc.\n * **Returns:** Dynamico object ready for initialization\n\n###### `public Dynamico setOptions(DynamicoOptions.Option ... options)`\n\nAttaches options to Dynamico object\n\n * **Parameters:** `options` — options for Dynamico (for example, ONLY_CACHE)\n * **Returns:** Dynamico object ready for initialization\n\n###### `public void initialize()`\n\nStarts layout fetching from cache/server depending on provided options\n\n## TODO\n\n* Support vector drawables\n* Support more views\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjelic98%2Fdynamico","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjelic98%2Fdynamico","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjelic98%2Fdynamico/lists"}