feat: 初次提交

This commit is contained in:
2022-09-08 20:37:34 +08:00
commit 9bfe047f28
61 changed files with 1384 additions and 0 deletions

1
app/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

62
app/build.gradle Normal file
View File

@@ -0,0 +1,62 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 31
defaultConfig {
applicationId "com.navinfo.jectpacklearn"
minSdk 23
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11
}
//启用DataBinding
buildFeatures {
dataBinding true
viewBinding true
}
}
ext.navigationVersion = "2.0.0"
ext.jetpackVersion = "2.5.1"
ext.binding_version = "1.1.8"
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'android.arch.lifecycle:common:1.1.1'
implementation 'androidx.navigation:navigation-common-ktx:2.5.1'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation "androidx.navigation:navigation-fragment-ktx:$jetpackVersion"
implementation "androidx.navigation:navigation-ui-ktx:$jetpackVersion"
implementation "androidx.lifecycle:lifecycle-process:$jetpackVersion"
implementation "androidx.lifecycle:lifecycle-runtime:$jetpackVersion"
implementation "androidx.lifecycle:lifecycle-viewmodel:$jetpackVersion"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$jetpackVersion"
implementation "com.hi-dhl:binding:$binding_version"
}

21
app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,24 @@
package com.navinfo.jectpacklearn
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.navinfo.jectpacklearn", appContext.packageName)
}
}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.navinfo.jectpacklearn">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:name=".MainApplication"
android:supportsRtl="true"
android:theme="@style/Theme.JectPackLearn">
<activity
android:name=".StartActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".BindViewTestActivity"
android:exported="true">
</activity>
<activity
android:name=".NavigationActivity"
android:exported="true">
</activity>
<activity
android:name=".LifecycleActivity"
android:exported="true">
</activity>
</application>
</manifest>

View File

@@ -0,0 +1,6 @@
package com.navinfo
data class LiveDataModel(
val id: Int,
var name: String,
var age: Int)

View File

@@ -0,0 +1,24 @@
package com.navinfo.jectpacklearn
import android.os.Bundle
import android.os.PersistableBundle
import android.view.LayoutInflater
import androidx.appcompat.app.AppCompatActivity
import com.navinfo.jectpacklearn.databinding.BindViewTestActivityBinding
class BindViewTestActivity : AppCompatActivity(){
private lateinit var bindView: BindViewTestActivityBinding
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bindView = BindViewTestActivityBinding.inflate(layoutInflater)
val rootView = bindView.root
setContentView(rootView)
bindView.tvBindText.text = "测试1212121212"
}
}

View File

@@ -0,0 +1,24 @@
package com.navinfo.jectpacklearn
import android.os.Bundle
import androidx.activity.ComponentActivity
import com.hi.dhl.binding.databind
import com.hi.dhl.binding.viewbind
import com.navinfo.jectpacklearn.databinding.ActivityLifecycleBinding
import com.navinfo.jectpacklearn.lifecycle.LifeCycleTest
class LifecycleActivity: ComponentActivity() {
val viewbinding by viewbind<ActivityLifecycleBinding>()
val lifecycleTest by lazy { LifeCycleTest() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(viewbinding.root)
viewbinding.tvLifecycleName.text = "name"
lifecycle.addObserver(lifecycleTest)
}
override fun onDestroy() {
super.onDestroy()
lifecycle.removeObserver(lifecycleTest)
}
}

View File

@@ -0,0 +1,26 @@
package com.navinfo.jectpacklearn
import android.os.Bundle
import android.os.PersistableBundle
import androidx.activity.ComponentActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.navinfo.LiveDataModel
import com.navinfo.jectpacklearn.lifecycle.LiveDataViewModelLifeCycle
import com.navinfo.jectpacklearn.viewmodel.LiveDataViewModel
class LiveDataViewModelActivity: ComponentActivity() {
private val currentLifeCycle by lazy { LiveDataViewModelLifeCycle() }
private lateinit var liveDataViewModel: LiveDataViewModel
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
lifecycle.addObserver(currentLifeCycle)
liveDataViewModel = ViewModelProvider(this).get(LiveDataViewModel::class.java)
}
override fun onDestroy() {
super.onDestroy()
lifecycle.removeObserver(currentLifeCycle)
}
}

View File

@@ -0,0 +1,91 @@
package com.navinfo.jectpacklearn
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.navinfo.jectpacklearn.lifecycle.MyLifeCycle
import com.navinfo.jectpacklearn.viewmodel.MainViewModel
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.coroutineContext
class MainActivity : AppCompatActivity() {
private lateinit var mainViewModel: MainViewModel;
private lateinit var edtAccount: EditText;
private lateinit var edtPwd: EditText;
private lateinit var btnLogin: Button;
private lateinit var tvAccount: TextView;
private lateinit var tvPwd: TextView;
private val myLifeCycle by lazy { MyLifeCycle() }
private val btnCorutine: Button by lazy { findViewById(R.id.btn_corutine) }
private val channel by lazy { Channel<Job>(Channel.UNLIMITED) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
edtAccount = findViewById(R.id.edt_account);
edtPwd = findViewById(R.id.edt_pwd);
btnLogin = findViewById(R.id.btn_login)
tvAccount = findViewById(R.id.tv_account)
tvPwd = findViewById(R.id.tv_pwd)
btnLogin.setOnClickListener(fun (view: View) {
mainViewModel.account.value = edtAccount.text.toString().trim()
mainViewModel.pwd.value = edtPwd.text.toString().trim()
if (mainViewModel.account.value.equals("")) {
Toast.makeText(this@MainActivity, "用户名不能为空", Toast.LENGTH_SHORT).show()
return;
}
if (mainViewModel.pwd.value.equals("")) {
Toast.makeText(this@MainActivity, "密码不能为空", Toast.LENGTH_SHORT).show()
return;
}
Toast.makeText(this@MainActivity, "登录成功", Toast.LENGTH_SHORT).show()
val intent = Intent(this@MainActivity, BindViewTestActivity::class.java)
startActivity(intent)
})
mainViewModel.account.observe(this@MainActivity, Observer { tvAccount.text = it } )
lifecycle.addObserver(myLifeCycle)
btnCorutine.setOnClickListener {
val channelJob = lifecycleScope.async(Dispatchers.IO) {
suspendFun1()
}
lifecycleScope.launch(Dispatchers.Default) {
channel.send(channelJob)
}
}
lifecycleScope.launch {
val deffered = channel.receive() as Deferred<Int>
println("deffered.await(): ${deffered.await()}")
}
}
private suspend fun suspendFun1(): Int {
delay(3000)
return 3000
}
override fun onDestroy() {
super.onDestroy()
lifecycle.removeObserver(myLifeCycle)
channel.close()
}
}

View File

@@ -0,0 +1,13 @@
package com.navinfo.jectpacklearn
import android.app.Application
import androidx.lifecycle.ProcessLifecycleOwner
import com.navinfo.jectpacklearn.lifecycle.MyApplicationLifeCycle
class MainApplication: Application() {
val applicationLifeCycle by lazy { MyApplicationLifeCycle() }
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(applicationLifeCycle)
}
}

View File

@@ -0,0 +1,14 @@
package com.navinfo.jectpacklearn
import android.os.Bundle
import androidx.activity.ComponentActivity
class NavigationActivity: ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onDestroy() {
super.onDestroy()
}
}

View File

@@ -0,0 +1,32 @@
package com.navinfo.jectpacklearn
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.activity.ComponentActivity
import com.hi.dhl.binding.viewbind
import com.navinfo.jectpacklearn.databinding.ActivityStartBinding
class StartActivity : ComponentActivity(), View.OnClickListener {
// ViewBinding自动绑定
private val viewBind by viewbind<ActivityStartBinding>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(viewBind.root)
viewBind.btnStart2Navigation.setOnClickListener(this::onClick)
viewBind.btnStart2Lifecycle.setOnClickListener(this::onClick)
}
override fun onClick(view: View?) {
var intent: Intent = let {
when(view!!.id) {
R.id.btn_start_2_navigation -> Intent(this, NavigationActivity::class.java)
R.id.btn_start_2_lifecycle -> Intent(this, LifecycleActivity::class.java)
else -> Intent(this, NavigationActivity::class.java)
}
}
startActivity(intent)
}
}

View File

@@ -0,0 +1,15 @@
package com.navinfo.jectpacklearn.fragment
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.hi.dhl.binding.databind
import com.hi.dhl.binding.viewbind
import com.navinfo.jectpacklearn.databinding.FragmentLayoutABinding
class FragmentA: Fragment() {
val binding: FragmentLayoutABinding by viewbind()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}

View File

@@ -0,0 +1,15 @@
package com.navinfo.jectpacklearn.fragment
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.hi.dhl.binding.databind
import com.hi.dhl.binding.viewbind
import com.navinfo.jectpacklearn.databinding.FragmentLayoutBBinding
class FragmentB: Fragment() {
val binding: FragmentLayoutBBinding by viewbind()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}

View File

@@ -0,0 +1,14 @@
package com.navinfo.jectpacklearn.fragment
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.hi.dhl.binding.viewbind
import com.navinfo.jectpacklearn.databinding.FragmentLayoutCBinding
class FragmentC: Fragment() {
val binding: FragmentLayoutCBinding by viewbind()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}

View File

@@ -0,0 +1,38 @@
package com.navinfo.jectpacklearn.lifecycle
import android.util.Log
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
class LifeCycleTest: DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
Log.d(javaClass.name, "onCreate")
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
Log.d(javaClass.name, "onStart")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
Log.d(javaClass.name, "onResume")
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
Log.d(javaClass.name, "onPause")
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
Log.d(javaClass.name, "onStop")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
Log.d(javaClass.name, "onDestroy")
}
}

View File

@@ -0,0 +1,7 @@
package com.navinfo.jectpacklearn.lifecycle
import androidx.lifecycle.DefaultLifecycleObserver
class LiveDataViewModelLifeCycle: DefaultLifecycleObserver {
}

View File

@@ -0,0 +1,36 @@
package com.navinfo.jectpacklearn.lifecycle
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
class MyApplicationLifeCycle: DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
println("${javaClass.name}调用了定制化的onCreate方法")
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
println("${javaClass.name}调用了定制化的onStart方法")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
println("${javaClass.name}调用了定制化的onResume方法")
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
println("${javaClass.name}调用了定制化的onPause方法")
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
println("${javaClass.name}调用了定制化的onStop方法")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
println("${javaClass.name}调用了定制化的onDestroy方法")
}
}

View File

@@ -0,0 +1,38 @@
package com.navinfo.jectpacklearn.lifecycle
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.LifecycleOwner
class MyLifeCycle: DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
println("调用了定制化的onCreate方法")
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
println("调用了定制化的onStart方法")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
println("调用了定制化的onResume方法")
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
println("调用了定制化的onPause方法")
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
println("调用了定制化的onStop方法")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
println("调用了定制化的onDestroy方法")
}
}

View File

@@ -0,0 +1,9 @@
package com.navinfo.jectpacklearn.viewmodel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.navinfo.LiveDataModel
class LiveDataViewModel: ViewModel() {
val liveDataModel= MutableLiveData<LiveDataModel>()
}

View File

@@ -0,0 +1,10 @@
package com.navinfo.jectpacklearn.viewmodel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MainViewModel: ViewModel(){
var account: MutableLiveData<String> = MutableLiveData()
var pwd: MutableLiveData<String> = MutableLiveData()
}

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/tv_lifecycle_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="lifecycle"
app:layout_constraintTop_toTopOf="parent"></com.google.android.material.textview.MaterialTextView>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/layer_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edt_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="账号"></com.google.android.material.textfield.TextInputEditText>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.divider.MaterialDivider
android:id="@+id/divder"
android:layout_width="match_parent"
android:layout_height="5dp"
app:layout_constraintTop_toBottomOf="@id/layer_account"></com.google.android.material.divider.MaterialDivider>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/layer_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/divder">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edt_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="密码"></com.google.android.material.textfield.TextInputEditText>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/layer_pwd"
android:text="登录"
></com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_corutine"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="协程测试"
app:layout_constraintTop_toBottomOf="@id/btn_login"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"></androidx.appcompat.widget.AppCompatTextView>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"></androidx.appcompat.widget.AppCompatTextView>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_start_2_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Jetpack-Navigation">
</com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_start_2_lifecycle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Jetpack-lifecycle">
</com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_start_2_viewmodel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Jetpack-lifecycle">
</com.google.android.material.button.MaterialButton>
</LinearLayout>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/tv_bind_text"
android:layout_width="match_parent"
android:text="1111"
android:textColor="@color/black"
android:layout_height="wrap_content"></com.google.android.material.textview.MaterialTextView>
</LinearLayout>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="FragmentA"></com.google.android.material.textview.MaterialTextView>
</LinearLayout>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="FragmentB"></com.google.android.material.textview.MaterialTextView>
</LinearLayout>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="FragmentC"></com.google.android.material.textview.MaterialTextView>
</LinearLayout>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/jetpack_navigation">
<fragment android:id="@+id/fragmentA"
></fragment>
</navigation>

View File

@@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.JectPackLearn" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<string name="app_name">JectPackLearn</string>
</resources>

View File

@@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.JectPackLearn" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -0,0 +1,17 @@
package com.navinfo.jectpacklearn
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}