├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── hi │ │ └── dhl │ │ └── jdatabinding │ │ └── demo │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── hi │ │ │ └── dhl │ │ │ └── jdatabinding │ │ │ └── demo │ │ │ ├── App.kt │ │ │ ├── AppDialog.kt │ │ │ ├── binding │ │ │ └── RecycleViewBinding.kt │ │ │ ├── di │ │ │ └── AppModule.kt │ │ │ └── ui │ │ │ ├── FragmentTest.kt │ │ │ ├── MainActivity.kt │ │ │ ├── MainViewModel.kt │ │ │ └── adapter │ │ │ ├── HeaderViewHolder.kt │ │ │ ├── TestAdapter.kt │ │ │ └── TestViewHolder.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── dialog_app.xml │ │ ├── fragment_test.xml │ │ ├── recycie_item_footer.xml │ │ ├── recycie_item_header.xml │ │ └── recycie_item_test.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── hi │ └── dhl │ └── jdatabinding │ └── demo │ └── ExampleUnitTest.kt ├── build.gradle ├── buildSrc ├── build.gradle.kts └── src │ ├── main │ └── java │ │ └── com │ │ └── hi │ │ └── dhl │ │ └── Deps.kt │ └── test │ └── kotlin │ └── com │ └── hi │ └── dhl │ └── DepsTest.java ├── gradle.properties ├── gradle └── wrapper │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── jdatabinding ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro ├── publish.gradle └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── hi │ │ └── dhl │ │ └── jdatabinding │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── hi │ │ └── dhl │ │ └── jdatabinding │ │ ├── ActivityDataBindingDelegate.kt │ │ ├── DataBindingActivity.kt │ │ ├── DataBindingDialog.kt │ │ ├── DataBindingFragment.kt │ │ ├── DataBindingListAdapter.kt │ │ ├── DataBindingViewHolder.kt │ │ └── ext │ │ ├── ContextExt.kt │ │ ├── LifecycleExt.kt │ │ └── ReflectExt.kt │ └── test │ └── java │ └── com │ └── hi │ └── dhl │ └── jdatabinding │ └── ExampleUnitTest.kt └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows: 2 | Thumbs.db 3 | ehthumbs.db 4 | Desktop.ini 5 | 6 | # Python: 7 | *.py[cod] 8 | *.so 9 | *.egg 10 | *.egg-info 11 | dist 12 | build 13 | migrations 14 | 15 | #Django 16 | *.egg-info 17 | *.pot 18 | *.py[co] 19 | .tox/ 20 | __pycache__ 21 | MANIFEST 22 | dist/ 23 | docs/_build/ 24 | docs/locale/ 25 | node_modules/ 26 | tests/coverage_html/ 27 | tests/.coverage 28 | build/ 29 | tests/report/ 30 | 31 | #-------------------------------- 32 | __pycache__/ 33 | *.py[cod] 34 | *$py.class 35 | 36 | # C extensions 37 | *.so 38 | 39 | # Distribution / packaging 40 | .Python 41 | env/ 42 | build/ 43 | develop-eggs/ 44 | dist/ 45 | downloads/ 46 | eggs/ 47 | .eggs/ 48 | lib/ 49 | lib64/ 50 | parts/ 51 | sdist/ 52 | var/ 53 | *.egg-info/ 54 | .installed.cfg 55 | *.egg 56 | 57 | # PyInstaller 58 | # Usually these files are written by a python script from a template 59 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 60 | *.manifest 61 | *.spec 62 | 63 | # Installer logs 64 | pip-log.txt 65 | pip-delete-this-directory.txt 66 | 67 | # Unit test / coverage reports 68 | htmlcov/ 69 | .tox/ 70 | .coverage 71 | .coverage.* 72 | .cache 73 | nosetests.xml 74 | coverage.xml 75 | *,cover 76 | .hypothesis/ 77 | 78 | # Translations 79 | *.mo 80 | *.pot 81 | 82 | # Django stuff: 83 | *.log 84 | local_settings.py 85 | 86 | # Flask stuff: 87 | instance/ 88 | .webassets-cache 89 | 90 | # Scrapy stuff: 91 | .scrapy 92 | 93 | # Sphinx documentation 94 | docs/_build/ 95 | 96 | # PyBuilder 97 | target/ 98 | 99 | # IPython Notebook 100 | .ipynb_checkpoints 101 | 102 | # pyenv 103 | .python-version 104 | 105 | # celery beat schedule file 106 | celerybeat-schedule 107 | 108 | # dotenv 109 | .env 110 | 111 | # virtualenv 112 | venv/ 113 | ENV/ 114 | 115 | # Spyder project settings 116 | .spyderproject 117 | 118 | # Rope project settings 119 | .ropeproject 120 | 121 | database/ 122 | media/ 123 | whoosh_index/ 124 | .idea/ 125 | *.sqlite3 126 | fabfile.py 127 | 128 | 129 | 130 | #-------------------------------- 131 | 132 | 133 | #java 134 | *.class 135 | 136 | # Package Files # 137 | *.jar 138 | *.war 139 | *.ear 140 | 141 | # Mobile Tools for Java (J2ME) 142 | .mtj.tmp/ 143 | 144 | 145 | # My configurations: 146 | db.ini 147 | deploy_key_rsa 148 | 149 | # Package Files # 150 | *.jar 151 | *.war 152 | *.ear 153 | 154 | #phpstorm 155 | *.idea 156 | 157 | #过滤数据库文件、sln解决方案文件、配置文件 158 | *.mdb 159 | *.ldb 160 | *.sln 161 | *.config 162 | 163 | #other 164 | data/error/ 165 | .idea*/ 166 | .idea/ 167 | *.htm 168 | 169 | # 忽略名称中末尾为ignore的文件夹 170 | *ignore/ 171 | *ignore*/ 172 | 173 | 174 | 175 | 176 | # Logs 177 | logs 178 | *.log 179 | npm-debug.log* 180 | # Runtime data 181 | pids 182 | *.pid 183 | *.seed 184 | *.pid.lock 185 | # Directory for instrumented libs generated by jscoverage/JSCover 186 | lib-cov 187 | # Coverage directory used by tools like istanbul 188 | coverage 189 | # nyc test coverage 190 | .nyc_output 191 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 192 | .grunt 193 | # Bower dependency directory (https://bower.io/) 194 | bower_components 195 | # node-waf configuration 196 | .lock-wscript 197 | # Compiled binary addons (http://nodejs.org/api/addons.html) 198 | build/Release 199 | # Dependency directories 200 | node_modules/ 201 | jspm_packages/ 202 | # Typescript v1 declaration files 203 | typings/ 204 | # Optional npm cache directory 205 | .npm 206 | # Optional eslint cache 207 | .eslintcache 208 | # Optional REPL history 209 | .node_repl_history 210 | # Output of 'npm pack' 211 | *.tgz 212 | # Yarn Integrity file 213 | .yarn-integrity 214 | # dotenv environment variables file 215 | .env 216 | .vscode 217 | # ignore sh 218 | sh/ 219 | # ignore test sdk.config.json 220 | sdk.config.json 221 | # ignore local config 222 | server/config.local.js 223 | 224 | 225 | #-------android 226 | # Built application files 227 | #*.apk 228 | *.ap_ 229 | 230 | # Files for the ART/Dalvik VM 231 | *.dex 232 | 233 | # Java class files 234 | *.class 235 | 236 | # Generated files 237 | bin/ 238 | gen/ 239 | out/ 240 | 241 | # Gradle files 242 | .gradle/ 243 | build/ 244 | 245 | # Local configuration file (sdk path, etc) 246 | local.properties 247 | 248 | # Proguard folder generated by Eclipse 249 | proguard/ 250 | 251 | # Log Files 252 | *.log 253 | 254 | # Android Studio Navigation editor temp files 255 | .navigation/ 256 | 257 | # Android Studio captures folder 258 | captures/ 259 | 260 | # Intellij 261 | *.iml 262 | .idea/ 263 | 264 | # Keystore files 265 | *.jks 266 | 267 | # External native build folder generated in Android Studio 2.2 and later 268 | .externalNativeBuild 269 | 270 | # DS_Store files 271 | *.DS_Store 272 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #
JDataBinding
2 | 3 |
4 | JDataBinding 是基于 DataBinding 封装的基础库,欢迎 star
5 |
14 | * author: dhl 15 | * date : 2020/4/19 16 | * desc : 17 | *18 | */ 19 | class App : Application() { 20 | 21 | override fun onCreate() { 22 | super.onCreate() 23 | startKoin { 24 | AndroidLogger(Level.DEBUG) 25 | androidContext(this@App) 26 | fragmentFactory() 27 | loadKoinModules(appModules) 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/hi/dhl/jdatabinding/demo/AppDialog.kt: -------------------------------------------------------------------------------- 1 | package com.hi.dhl.jdatabinding.demo 2 | 3 | import android.app.Dialog 4 | import android.content.Context 5 | import android.os.Bundle 6 | import android.view.Window 7 | import com.hi.dhl.jdatabinding.binding 8 | import com.hi.dhl.jdatabinding.demo.databinding.DialogAppBinding 9 | 10 | /** 11 | *
12 | * author: dhl 13 | * date : 2020/4/9 14 | * desc : 15 | *16 | */ 17 | class AppDialog( 18 | context: Context, 19 | val title: String? = null, 20 | val message: String? = null, 21 | val yes: AppDialog.() -> Unit 22 | ) : Dialog(context, R.style.AppDialog) { 23 | private val mBinding: DialogAppBinding by binding() 24 | 25 | init { 26 | requireNotNull(message) { "message must be not null" } 27 | } 28 | 29 | override fun onCreate(savedInstanceState: Bundle?) { 30 | super.onCreate(savedInstanceState) 31 | requestWindowFeature(Window.FEATURE_NO_TITLE) 32 | 33 | mBinding.apply { 34 | display.text = message 35 | btnNo.setOnClickListener { dismiss() } 36 | btnYes.setOnClickListener { yes() } 37 | } 38 | 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/hi/dhl/jdatabinding/demo/binding/RecycleViewBinding.kt: -------------------------------------------------------------------------------- 1 | package com.hi.dhl.jdatabinding.demo.binding 2 | 3 | import androidx.databinding.BindingAdapter 4 | import androidx.recyclerview.widget.RecyclerView 5 | import com.hi.dhl.jdatabinding.demo.ui.Model 6 | import com.hi.dhl.jdatabinding.demo.ui.adapter.TestAdapter 7 | 8 | /** 9 | *
10 | * author: dhl 11 | * date : 2020/3/23 12 | * desc : 13 | *14 | */ 15 | 16 | @BindingAdapter("adapter") 17 | fun bindAdapter(recyclerView: RecyclerView, adapter: TestAdapter) { 18 | recyclerView.adapter = adapter 19 | } 20 | 21 | @BindingAdapter("adapterList") 22 | fun bindAdapterList(recyclerView: RecyclerView, data: List
11 | * author: dhl 12 | * date : 2020/4/19 13 | * desc : 14 | *15 | */ 16 | val viewModelsModule = module { 17 | viewModel { MainViewModel() } 18 | } 19 | 20 | val fragmentModules = module { 21 | fragment { FragmentTest(get()) } 22 | } 23 | 24 | val appModules = listOf(fragmentModules, viewModelsModule) -------------------------------------------------------------------------------- /app/src/main/java/com/hi/dhl/jdatabinding/demo/ui/FragmentTest.kt: -------------------------------------------------------------------------------- 1 | package com.hi.dhl.jdatabinding.demo.ui 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.fragment.app.Fragment 6 | import com.hi.dhl.jdatabinding.binding 7 | import com.hi.dhl.jdatabinding.demo.R 8 | import com.hi.dhl.jdatabinding.demo.databinding.FragmentTestBinding 9 | import com.hi.dhl.jdatabinding.demo.ui.adapter.TestAdapter 10 | 11 | /** 12 | *
13 | * author: dhl 14 | * date : 2020/4/9 15 | * desc : 16 | *17 | */ 18 | 19 | class FragmentTest(val mainViewModel: MainViewModel) : Fragment(R.layout.fragment_test) { 20 | 21 | val bind: FragmentTestBinding by binding() 22 | 23 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 24 | super.onViewCreated(view, savedInstanceState) 25 | bind.apply { 26 | viewModel = mainViewModel 27 | testAdapter = TestAdapter() 28 | lifecycleOwner = this@FragmentTest 29 | } 30 | } 31 | 32 | companion object { 33 | const val KEY_NAME = "FragmentTest" 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/hi/dhl/jdatabinding/demo/ui/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.hi.dhl.jdatabinding.demo.ui 2 | 3 | import android.app.Activity 4 | import android.os.Bundle 5 | import android.widget.Toast 6 | import androidx.fragment.app.FragmentActivity 7 | import com.hi.dhl.jdatabinding.binding 8 | import com.hi.dhl.jdatabinding.demo.AppDialog 9 | import com.hi.dhl.jdatabinding.demo.R 10 | import com.hi.dhl.jdatabinding.demo.databinding.ActivityMainBinding 11 | import org.koin.androidx.fragment.android.setupKoinFragmentFactory 12 | 13 | class MainActivity : FragmentActivity() { 14 | private val mBinding: ActivityMainBinding by binding() 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | setupKoinFragmentFactory() 18 | super.onCreate(savedInstanceState) 19 | mBinding.apply { 20 | dialog.setOnClickListener { 21 | val msg = getString(R.string.dialog_msg) 22 | AppDialog( 23 | context = this@MainActivity, 24 | message = msg, 25 | yes = { 26 | Toast.makeText(this@MainActivity, msg, Toast.LENGTH_SHORT).show() 27 | }).show() 28 | } 29 | 30 | if (savedInstanceState == null) { 31 | addFragment() 32 | } 33 | } 34 | } 35 | 36 | private fun addFragment() { 37 | val arguments = Bundle().apply { 38 | putString(FragmentTest.KEY_NAME, "来源于 MainActivity") 39 | } 40 | 41 | supportFragmentManager.beginTransaction() 42 | .replace(R.id.container, FragmentTest::class.java, arguments) 43 | .commit() 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/hi/dhl/jdatabinding/demo/ui/MainViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.hi.dhl.jdatabinding.demo.ui 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | import androidx.lifecycle.ViewModel 5 | import androidx.recyclerview.widget.DiffUtil 6 | 7 | /** 8 | *
9 | * author: dhl 10 | * date : 2020/4/19 11 | * desc : 12 | *13 | */ 14 | class MainViewModel : ViewModel() { 15 | public val mLiveData: MutableLiveData
10 | * author: dhl 11 | * date : 2020/4/19 12 | * desc : 13 | *14 | */ 15 | class HeaderViewHolder(view: View) : DataBindingViewHolder
11 | * author: dhl 12 | * date : 2020/4/19 13 | * desc : 14 | *15 | */ 16 | class TestAdapter : DataBindingListAdapter
10 | * author: dhl 11 | * date : 2020/4/19 12 | * desc : 13 | *14 | */ 15 | class TestViewHolder(view: View) : DataBindingViewHolder
6 | * author: dhl 7 | * date : 2020/5/29 8 | * desc : 9 | *10 | */ 11 | public class DepsTest { 12 | 13 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official 22 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri May 29 16:46:03 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | # Determine the Java command to use to start the JVM. 86 | if [ -n "$JAVA_HOME" ] ; then 87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 88 | # IBM's JDK on AIX uses strange locations for the executables 89 | JAVACMD="$JAVA_HOME/jre/sh/java" 90 | else 91 | JAVACMD="$JAVA_HOME/bin/java" 92 | fi 93 | if [ ! -x "$JAVACMD" ] ; then 94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 95 | 96 | Please set the JAVA_HOME variable in your environment to match the 97 | location of your Java installation." 98 | fi 99 | else 100 | JAVACMD="java" 101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 102 | 103 | Please set the JAVA_HOME variable in your environment to match the 104 | location of your Java installation." 105 | fi 106 | 107 | # Increase the maximum file descriptors if we can. 108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 109 | MAX_FD_LIMIT=`ulimit -H -n` 110 | if [ $? -eq 0 ] ; then 111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 112 | MAX_FD="$MAX_FD_LIMIT" 113 | fi 114 | ulimit -n $MAX_FD 115 | if [ $? -ne 0 ] ; then 116 | warn "Could not set maximum file descriptor limit: $MAX_FD" 117 | fi 118 | else 119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 120 | fi 121 | fi 122 | 123 | # For Darwin, add options to specify how the application appears in the dock 124 | if $darwin; then 125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 126 | fi 127 | 128 | # For Cygwin or MSYS, switch paths to Windows format before running java 129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 132 | JAVACMD=`cygpath --unix "$JAVACMD"` 133 | 134 | # We build the pattern for arguments to be converted via cygpath 135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 136 | SEP="" 137 | for dir in $ROOTDIRSRAW ; do 138 | ROOTDIRS="$ROOTDIRS$SEP$dir" 139 | SEP="|" 140 | done 141 | OURCYGPATTERN="(^($ROOTDIRS))" 142 | # Add a user-defined pattern to the cygpath arguments 143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 145 | fi 146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 147 | i=0 148 | for arg in "$@" ; do 149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 151 | 152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 154 | else 155 | eval `echo args$i`="\"$arg\"" 156 | fi 157 | i=`expr $i + 1` 158 | done 159 | case $i in 160 | 0) set -- ;; 161 | 1) set -- "$args0" ;; 162 | 2) set -- "$args0" "$args1" ;; 163 | 3) set -- "$args0" "$args1" "$args2" ;; 164 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 165 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 166 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 167 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 168 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 169 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 170 | esac 171 | fi 172 | 173 | # Escape application args 174 | save () { 175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 176 | echo " " 177 | } 178 | APP_ARGS=`save "$@"` 179 | 180 | # Collect all arguments for the java command, following the shell quoting and substitution rules 181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 182 | 183 | exec "$JAVACMD" "$@" 184 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 34 | 35 | @rem Find java.exe 36 | if defined JAVA_HOME goto findJavaFromJavaHome 37 | 38 | set JAVA_EXE=java.exe 39 | %JAVA_EXE% -version >NUL 2>&1 40 | if "%ERRORLEVEL%" == "0" goto init 41 | 42 | echo. 43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 44 | echo. 45 | echo Please set the JAVA_HOME variable in your environment to match the 46 | echo location of your Java installation. 47 | 48 | goto fail 49 | 50 | :findJavaFromJavaHome 51 | set JAVA_HOME=%JAVA_HOME:"=% 52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 53 | 54 | if exist "%JAVA_EXE%" goto init 55 | 56 | echo. 57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 58 | echo. 59 | echo Please set the JAVA_HOME variable in your environment to match the 60 | echo location of your Java installation. 61 | 62 | goto fail 63 | 64 | :init 65 | @rem Get command-line arguments, handling Windows variants 66 | 67 | if not "%OS%" == "Windows_NT" goto win9xME_args 68 | 69 | :win9xME_args 70 | @rem Slurp the command line arguments. 71 | set CMD_LINE_ARGS= 72 | set _SKIP=2 73 | 74 | :win9xME_args_slurp 75 | if "x%~1" == "x" goto execute 76 | 77 | set CMD_LINE_ARGS=%* 78 | 79 | :execute 80 | @rem Setup the command line 81 | 82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 83 | 84 | @rem Execute Gradle 85 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 86 | 87 | :end 88 | @rem End local scope for the variables with windows NT shell 89 | if "%ERRORLEVEL%"=="0" goto mainEnd 90 | 91 | :fail 92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 93 | rem the _cmd.exe /c_ return code! 94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 95 | exit /b 1 96 | 97 | :mainEnd 98 | if "%OS%"=="Windows_NT" endlocal 99 | 100 | :omega 101 | -------------------------------------------------------------------------------- /jdatabinding/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /jdatabinding/build.gradle: -------------------------------------------------------------------------------- 1 | import com.hi.dhl.* 2 | 3 | apply plugin: 'com.android.library' 4 | apply plugin: 'kotlin-android' 5 | apply plugin: 'kotlin-android-extensions' 6 | 7 | android { 8 | compileSdkVersion Config.compileSdkVersion 9 | buildToolsVersion Config.buildToolsVersion 10 | 11 | defaultConfig { 12 | minSdkVersion Config.minSdkVersion 13 | targetSdkVersion Config.targetSdkVersion 14 | versionCode 10004 15 | versionName "1.0.4" 16 | 17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 18 | consumerProguardFiles 'consumer-rules.pro' 19 | } 20 | 21 | buildTypes { 22 | release { 23 | minifyEnabled false 24 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 25 | } 26 | } 27 | 28 | dataBinding { 29 | enabled = true 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation fileTree(dir: 'libs', include: ['*.jar']) 35 | implementation Deps.kotlinStdlibJdk7 36 | implementation Deps.appcompat 37 | implementation Deps.ktsCode 38 | implementation Deps.recyclerview 39 | implementation Deps.fragment 40 | 41 | testImplementation Deps.junit 42 | androidTestImplementation Deps.junitExt 43 | androidTestImplementation Deps.espressoCore 44 | } -------------------------------------------------------------------------------- /jdatabinding/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hi-dhl/JDataBinding/a1e5a4a12e168b2b18778fece3f43b262642dc8d/jdatabinding/consumer-rules.pro -------------------------------------------------------------------------------- /jdatabinding/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /jdatabinding/publish.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hi-dhl/JDataBinding/a1e5a4a12e168b2b18778fece3f43b262642dc8d/jdatabinding/publish.gradle -------------------------------------------------------------------------------- /jdatabinding/src/androidTest/java/com/hi/dhl/jdatabinding/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.hi.dhl.jdatabinding 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.hi.dhl.jdatabinding.test", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jdatabinding/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |
14 | * author: dhl 15 | * date : 2020/4/9 16 | * desc : 17 | *18 | */ 19 | 20 | 21 | class ActivityDataBindingDelegate
14 | * author: dhl 15 | * date : 2020/4/9 16 | * desc : 17 | *18 | */ 19 | /** 20 | * jdatabinding >=1.0.4 和 jdatabinding < 1.0.4 用法不一样, 21 | * 22 | * 1.0.4 统一了 AppCompatActivity、FragmentActivity、Activity,处于 Lifecycle.State.DESTROYED 将会销毁数据 23 | * 1.0.4 使用更加简单,请查看 README.md 24 | */ 25 | inline fun
14 | * author: dhl 15 | * date : 2020/4/9 16 | * desc : 17 | *18 | */ 19 | 20 | inline fun