唯品会网站架构,织梦网络公司网站源码,cn域名后缀网站,网站备案号示例目录 一、基本使用二、ViewModel DataBinding LiveData结合使用1. java版本2. kotlin版本 一、基本使用
MyViewModel.kt
package com.example.myviewmodelimport androidx.lifecycle.ViewModelclass MyViewModel : ViewModel() {// 数据放这 进行横竖屏切换不会丢失var num… 目录 一、基本使用二、ViewModel DataBinding LiveData结合使用1. java版本2. kotlin版本 一、基本使用
MyViewModel.kt
package com.example.myviewmodelimport androidx.lifecycle.ViewModelclass MyViewModel : ViewModel() {// 数据放这 进行横竖屏切换不会丢失var number : Int 0
}MainActivity.kt
package com.example.myviewmodelimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
// Kotlin的绑定机制
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {// 数据放这 进行横竖屏切换会丢失// var number : Int 0private lateinit var myViewModel: MyViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// myViewModel MyViewModel() // 不能之间实例化因为这样写系统就不可控了// 旧版本的写法(扩展性不强)// ViewModelProviders.of(this).get(MyViewModel::class.java)// this ViewModelStoreOwner接口myViewModel ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java) // 通过反射来加载Java的class// Kotlin的绑定机制tv_number.text ${myViewModel.number}bt.setOnClickListener {tv_number.text ${myViewModel.number}}}
} 数据存放在ViewModelStore类中该类有一个Map存储String, ViewModelvalue为ViewModel该ViewModel存放相关的具体数据横竖屏切换保证ViewModelStore是同一个对象。
二、ViewModel DataBinding LiveData结合使用
1. java版本
activity_main.xml
?xml version1.0 encodingutf-8?
!-- DataBinding区域 --
layout xmlns:androidhttp://schemas.android.com/apk/res/androiddatavariablenamevmtypecom.example.jetpack_kotlin.MainViewModel //data!-- UI绘制区域 --LinearLayoutandroid:layout_widthfill_parentandroid:layout_heightfill_parentandroid:orientationverticalandroid:backgrounddrawable/phone2_bgLinearLayoutandroid:layout_widthfill_parentandroid:layout_height0dipandroid:layout_weight1 /!-- 电话号码 --TextViewandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:textSizedimen/activity_phone_tvandroid:gravitycenterandroid:text{vm.phoneInfo}android:textStylebold /!-- 表格布局 --TableLayoutandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_alignParentBottomtrueandroid:layout_marginBottom16dip!-- 第一列 --TableRowandroid:layout_widthfill_parentandroid:layout_heightwrap_contentButtonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone1android:onClick{()-vm.appendNumber(String.valueOf(1))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone2android:onClick{()-vm.appendNumber(String.valueOf(2))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone3android:onClick{()-vm.appendNumber(String.valueOf(3))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number //TableRow!-- 第二列 --TableRowandroid:layout_widthfill_parentandroid:layout_heightwrap_contentButtonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone4android:onClick{()-vm.appendNumber(String.valueOf(4))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone5android:onClick{()-vm.appendNumber(String.valueOf(5))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone6android:onClick{()-vm.appendNumber(String.valueOf(6))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number //TableRow!-- 第3列 --TableRowandroid:layout_widthfill_parentandroid:layout_heightwrap_contentButtonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone7android:onClick{()-vm.appendNumber(String.valueOf(7))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone8android:onClick{()-vm.appendNumber(String.valueOf(8))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone9android:onClick{()-vm.appendNumber(String.valueOf(9))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number //TableRow!-- 第4列 --TableRowandroid:layout_widthfill_parentandroid:layout_heightwrap_contentButtonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phonexinandroid:onClick{()-vm.appendNumber(string/phonexin)}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phone0android:onClick{()-vm.appendNumber(String.valueOf(0))}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number /Buttonandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:textstring/phonejinandroid:onClick{()-vm.appendNumber(string/phonejin)}android:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_number //TableRow!-- 第5列 --TableRowandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_marginTop6dipLinearLayoutandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:orientationvertical!-- 清空 --Buttonandroid:layout_width40dpandroid:layout_height40dpandroid:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_minandroid:layout_gravitycenterandroid:onClick{()-vm.clear()}android:layout_margin6dip //LinearLayoutLinearLayoutandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:orientationvertical!-- 拨打 --ImageViewandroid:layout_width46dipandroid:layout_height46dipandroid:srcdrawable/phone_selector_callandroid:onClick{()-vm.callPhone()}android:layout_gravitycenter //LinearLayoutLinearLayoutandroid:layout_widthfill_parentandroid:layout_heightwrap_contentandroid:layout_weight1android:orientationvertical!-- 删除一个字符 --Buttonandroid:layout_width60dpandroid:layout_heightwrap_contentandroid:textSizedimen/activity_phone_btandroid:backgrounddrawable/phone_selector_backspaceandroid:layout_gravitycenterandroid:onClick{()-vm.backspaceNumber()}//LinearLayout/TableRow/TableLayout/LinearLayout
/layoutMainViewModel.java
package com.example.jetpack_java2;import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;/*** AndroidViewModel 与 ViewModel的区别是 AndroidViewModel自带application环境*/
public class MainViewModel extends AndroidViewModel {// 传统方式的数据// private String phoneInfo ; // 目前无法实现感应功能// 实现感应功能 LiveData DataBindingprivate MutableLiveDataString phoneInfo;// 环境private Context mContext;public MainViewModel(NonNull Application application) {super(application);mContext application;}// 把数据暴露出去 给布局用public MutableLiveDataString getPhoneInfo() {if (phoneInfo null) {phoneInfo new MutableLiveData();// 设置默认值phoneInfo.setValue();}return phoneInfo;}/*** 输入* param number*/public void appendNumber(String number) {phoneInfo.setValue(phoneInfo.getValue() number);}/*** 删除*/public void backspaceNumber() {int length phoneInfo.getValue().length();if (length 0) {phoneInfo.setValue(phoneInfo.getValue().substring(0, length - 1));}}/*** 清空*/public void clear() {phoneInfo.setValue();}/*** 拨打*/public void callPhone() {Intent intent new Intent();intent.setAction(Intent.ACTION_CALL);intent.setData(Uri.parse(tel: phoneInfo.getValue()));// 非Activity启动拨号 或者是 非Activity启动任何的 startActivity都会崩溃intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(intent);}
}
MainActivity.java
package com.example.jetpack_java2;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;import android.os.Bundle;
import android.view.View;import com.example.jetpack_java2.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {private ActivityMainBinding dataBinding; // DataBinding初始化private MainViewModel mainViewModel; // MainViewModel初始化Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// setContentView(R.layout.activity_main);dataBinding DataBindingUtil.setContentView(this, R.layout.activity_main);// 旧版本的写法// mainViewModel ViewModelProviders.of(this).get(MainViewModel.class);// 下面是新版本的写法// 如果MainViewModel extends ViewModel// mainViewModel new ViewModelProvider(this,// new ViewModelProvider.NewInstanceFactory()).get(MainViewModel.class);// 如果MainViewModel extends AndroidViewModelmainViewModel new ViewModelProvider(getViewModelStore(),new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MainViewModel.class);dataBinding.setVm(mainViewModel);dataBinding.setLifecycleOwner(this); // DataBinding与LiveData建立感应}
}AndroidManifest.xml
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackagecom.example.jetpack_java2uses-permission android:nameandroid.permission.READ_CONTACTS/uses-permission android:nameandroid.permission.WRITE_CONTACTS/uses-permission android:nameandroid.permission.CALL_PHONE/applicationandroid:allowBackuptrueandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/AppThemeactivity android:name.MainActivityintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity/application/manifest2. kotlin版本
MainViewModel.kt
package com.example.jetpack_kotlinimport android.app.Application
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveDataclass MainViewModel(application : Application) : AndroidViewModel(application) {// LiveData数据有感应val phoneInfo by lazy { MutableLiveDataString() }init {phoneInfo.value // 设置默认值}// 定义一个环境var mContext : Context application/*** 输入*/fun appendNumber(number : String) {phoneInfo.value phoneInfo.value number}/*** 删除*/fun backspaceNumberr() {var length phoneInfo.value?.length ?: 0if (length 0) {phoneInfo.value phoneInfo.value?.substring(0, length - 1)}}/*** 清空*/fun clear() {phoneInfo.value }/*** 拨号*/fun callPhone() {var intent Intent()intent.action Intent.ACTION_CALLintent.data Uri.parse(tel: phoneInfo.value)intent.flags Intent.FLAG_ACTIVITY_NEW_TASKmContext.startActivity(intent)}
}MainActivity.kt
package com.example.jetpack_kotlinimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.jetpack_kotlin.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {var binding : ActivityMainBinding ? nullvar viewModel : MainViewModel ? nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// setContentView(R.layout.activity_main)binding DataBindingUtil.setContentView(this, R.layout.activity_main)viewModel ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)).get(MainViewModel::class.java)binding?.vm viewModel// DataBinding 与 LiveData 建立感应binding?.lifecycleOwner this}
}