使用ModelView,DataBinding,LiveData开发计分板APP

致自己的Android自学开发笔记!点击获取源码

功能

  • 计分(+1、+2、+3)
  • 撤销
  • 重置
  • 本地化
  • 横竖版页面布局

1.build.gradle

apply plugin: 'com.android.application'android {    compileSdkVersion 28    defaultConfig {        applicationId "com.example.scoreboard"        minSdkVersion 19        targetSdkVersion 28        versionCode 1        versionName "1.0"        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"        android.defaultConfig.vectorDrawables.useSupportLibrary = true        dataBinding.enabled = true    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'        }    }}dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    implementation 'androidx.appcompat:appcompat:1.0.2'    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'androidx.test:runner:1.2.0'    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'    implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01'}

2.MyViewModel.java

package com.example.scoreboard;import androidx.lifecycle.MutableLiveData;import androidx.lifecycle.SavedStateHandle;import androidx.lifecycle.ViewModel;public class MyViewModel extends ViewModel {    private SavedStateHandle savedStateHandle;    private Integer scoreA,scoreB;    public MyViewModel(SavedStateHandle savedStateHandle){        this.savedStateHandle = savedStateHandle;    }    public MutableLiveData<Integer> getTeamA() {        if (!savedStateHandle.contains(MainActivity.TEAMA)) {           savedStateHandle.set(MainActivity.TEAMA,0);        }        return savedStateHandle.getLiveData(MainActivity.TEAMA);    }    public MutableLiveData<Integer> getTeamB() {        if (!savedStateHandle.contains(MainActivity.TEAMB)) {            savedStateHandle.set(MainActivity.TEAMB,0);        }        return savedStateHandle.getLiveData(MainActivity.TEAMB);    }    public void addAScore(Integer s) {        scoreA = getTeamA().getValue();        scoreB = getTeamB().getValue();        getTeamA().setValue(getTeamA().getValue()+s);    }    public void addBScore(Integer s) {        scoreA = getTeamA().getValue();        scoreB = getTeamB().getValue();        getTeamB().setValue(getTeamB().getValue()+s);    }    public void resetScore() {        scoreA = getTeamA().getValue();        scoreB = getTeamB().getValue();        getTeamA().setValue(0);        getTeamB().setValue(0);    }    public void undo() {        getTeamA().setValue(scoreA);        getTeamB().setValue(scoreB);    }}

3.layout_activity.xml

<?xml version="1.0" encoding="utf-8"?><layout 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">    <data>        <variable            name="data"            type="com.example.scoreboard.MyViewModel" />    data>    <androidx.constraintlayout.widget.ConstraintLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        tools:context=".MainActivity">        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.05" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.15" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline5"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.3" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline6"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.45" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline7"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.75" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline9"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.9" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline8"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.6" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline4"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="vertical"            app:layout_constraintGuide_percent="0.5" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline10"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="vertical"            app:layout_constraintGuide_percent="0.1" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline11"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="vertical"            app:layout_constraintGuide_percent="0.9" />        <TextView            android:id="@+id/textView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@string/tv_TeamA"            android:textColor="@android:color/holo_orange_dark"            android:textSize="@dimen/teamSize"            app:layout_constraintBottom_toTopOf="@+id/guideline2"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline" />        <TextView            android:id="@+id/textView2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@string/tv_TeamB"            android:textColor="@android:color/holo_orange_dark"            android:textSize="@dimen/teamSize"            app:layout_constraintBottom_toTopOf="@+id/guideline2"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline" />        <TextView            android:id="@+id/textView3"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginTop="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@{String.valueOf(data.getTeamA())}"            android:textColor="@android:color/holo_red_dark"            android:textSize="@dimen/scoreSize"            app:layout_constraintBottom_toTopOf="@+id/guideline5"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline2"            tools:text="159" />        <TextView            android:id="@+id/textView4"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@{String.valueOf(data.getTeamB())}"            android:textColor="@android:color/holo_blue_dark"            android:textSize="@dimen/scoreSize"            app:layout_constraintBottom_toTopOf="@+id/guideline5"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline2"            tools:text="75" />        <Button            android:id="@+id/button"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_red_dark"            android:onClick="@{()->data.addAScore(1)}"            android:text="@string/btn_addone"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline6"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline5" />        <Button            android:id="@+id/button2"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_blue_dark"            android:onClick="@{()->data.addBScore(1)}"            android:text="@string/btn_addone"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline6"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline5" />        <Button            android:id="@+id/button3"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_red_dark"            android:onClick="@{()->data.addAScore(2)}"            android:text="@string/btn_addtwo"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline8"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline6" />        <Button            android:id="@+id/button4"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_blue_dark"            android:onClick="@{()->data.addBScore(2)}"            android:text="@string/btn_addtwo"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline8"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline6" />        <Button            android:id="@+id/button5"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_red_dark"            android:onClick="@{()->data.addAScore(3)}"            android:text="@string/btn_addthree"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline7"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline8" />        <Button            android:id="@+id/button6"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_blue_dark"            android:onClick="@{()->data.addBScore(3)}"            android:text="@string/btn_addthree"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline7"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline8" />        <ImageView            android:id="@+id/imageView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:contentDescription="@string/iv_undo"            android:onClick="@{()->data.undo()}"            app:layout_constraintBottom_toTopOf="@+id/guideline9"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintHorizontal_bias="0.8"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline7"            app:srcCompat="@drawable/ic_undo_black_24dp" />        <ImageView            android:id="@+id/imageView2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:contentDescription="@string/iv_reset"            android:onClick="@{()->data.resetScore()}"            app:layout_constraintBottom_toTopOf="@+id/guideline9"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintHorizontal_bias="0.2"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline7"            app:srcCompat="@drawable/ic_refresh_black_24dp" />        <TextView            android:id="@+id/textView5"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:text="@string/tv_version"            app:layout_constraintBottom_toBottomOf="parent"            app:layout_constraintEnd_toEndOf="parent"            app:layout_constraintStart_toStartOf="parent"            app:layout_constraintTop_toTopOf="@+id/guideline9"            app:layout_constraintVertical_bias="0.73" />    androidx.constraintlayout.widget.ConstraintLayout>layout>

4.layout_activity.xml(Land)

<?xml version="1.0" encoding="utf-8"?><layout 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">    <data>        <variable            name="data"            type="com.example.scoreboard.MyViewModel" />    data>    <androidx.constraintlayout.widget.ConstraintLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        tools:context=".MainActivity">        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.03" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.13" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline5"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.27" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline6"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.47" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline7"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.87" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline9"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.94" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline8"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="horizontal"            app:layout_constraintGuide_percent="0.67" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline4"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="vertical"            app:layout_constraintGuide_percent="0.5" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline10"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="vertical"            app:layout_constraintGuide_percent="0.1" />        <androidx.constraintlayout.widget.Guideline            android:id="@+id/guideline11"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:orientation="vertical"            app:layout_constraintGuide_percent="0.9" />        <TextView            android:id="@+id/textView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@string/tv_TeamA"            android:textColor="@android:color/holo_orange_dark"            android:textSize="@dimen/teamSize"            app:layout_constraintBottom_toTopOf="@+id/guideline2"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline" />        <TextView            android:id="@+id/textView2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@string/tv_TeamB"            android:textColor="@android:color/holo_orange_dark"            android:textSize="@dimen/teamSize"            app:layout_constraintBottom_toTopOf="@+id/guideline2"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline" />        <TextView            android:id="@+id/textView3"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginTop="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@{String.valueOf(data.getTeamA())}"            android:textColor="@android:color/holo_red_dark"            android:textSize="@dimen/scoreSizeLand"            app:layout_constraintBottom_toTopOf="@+id/guideline5"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline2"            tools:text="159" />        <TextView            android:id="@+id/textView4"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:text="@{String.valueOf(data.getTeamB())}"            android:textColor="@android:color/holo_blue_dark"            android:textSize="@dimen/scoreSizeLand"            app:layout_constraintBottom_toTopOf="@+id/guideline5"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline2"            tools:text="75" />        <Button            android:id="@+id/button"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_red_dark"            android:onClick="@{()->data.addAScore(1)}"            android:text="@string/btn_addone"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline6"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline5" />        <Button            android:id="@+id/button2"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_blue_dark"            android:onClick="@{()->data.addBScore(1)}"            android:text="@string/btn_addone"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline6"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline5" />        <Button            android:id="@+id/button3"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_red_dark"            android:onClick="@{()->data.addAScore(2)}"            android:text="@string/btn_addtwo"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline8"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline6" />        <Button            android:id="@+id/button4"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_blue_dark"            android:onClick="@{()->data.addBScore(2)}"            android:text="@string/btn_addtwo"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline8"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline6" />        <Button            android:id="@+id/button5"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_red_dark"            android:onClick="@{()->data.addAScore(3)}"            android:text="@string/btn_addthree"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline7"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline8" />        <Button            android:id="@+id/button6"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="16dp"            android:background="@android:color/holo_blue_dark"            android:onClick="@{()->data.addBScore(3)}"            android:text="@string/btn_addthree"            android:textColor="@android:color/white"            android:textSize="30sp"            app:layout_constraintBottom_toTopOf="@+id/guideline7"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline8" />        <ImageView            android:id="@+id/imageView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:contentDescription="@string/iv_undo"            android:onClick="@{()->data.undo()}"            app:layout_constraintBottom_toTopOf="@+id/guideline9"            app:layout_constraintEnd_toStartOf="@+id/guideline4"            app:layout_constraintHorizontal_bias="0.8"            app:layout_constraintStart_toStartOf="@+id/guideline10"            app:layout_constraintTop_toTopOf="@+id/guideline7"            app:srcCompat="@drawable/ic_undo_black_24dp" />        <ImageView            android:id="@+id/imageView2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginTop="8dp"            android:layout_marginEnd="8dp"            android:layout_marginBottom="8dp"            android:contentDescription="@string/iv_reset"            android:onClick="@{()->data.resetScore()}"            app:layout_constraintBottom_toTopOf="@+id/guideline9"            app:layout_constraintEnd_toStartOf="@+id/guideline11"            app:layout_constraintHorizontal_bias="0.2"            app:layout_constraintStart_toStartOf="@+id/guideline4"            app:layout_constraintTop_toTopOf="@+id/guideline7"            app:srcCompat="@drawable/ic_refresh_black_24dp" />        <TextView            android:id="@+id/textView5"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="8dp"            android:layout_marginEnd="8dp"            android:text="@string/tv_version"            app:layout_constraintBottom_toBottomOf="parent"            app:layout_constraintEnd_toEndOf="parent"            app:layout_constraintStart_toStartOf="parent"            app:layout_constraintTop_toTopOf="@+id/guideline9"            app:layout_constraintVertical_bias="0.73" />    androidx.constraintlayout.widget.ConstraintLayout>layout>

5.MainActivity.java

package com.example.scoreboard;import androidx.appcompat.app.AppCompatActivity;import androidx.databinding.DataBindingUtil;import androidx.lifecycle.SavedStateVMFactory;import androidx.lifecycle.ViewModelProviders;import android.os.Bundle;import com.example.scoreboard.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {    MyViewModel myViewModel;    ActivityMainBinding binding;    public final static String TEAMA = "teamA",TEAMB = "teamB";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);        myViewModel = ViewModelProviders.of(this,new SavedStateVMFactory(this)).get(MyViewModel.class);        binding.setData(myViewModel);        binding.setLifecycleOwner(this);    }}

6.strings.xml

<resources>    <string name="app_name">ScoreBoardstring>    <string name="tv_TeamA">Team Astring>    <string name="tv_TeamB">Team Bstring>    <string name="tv_TeamAScore">TeamAScorestring>    <string name="tv_TeamBScore">TeamBScorestring>    <string name="btn_addone" translatable="false">+1string>    <string name="btn_addtwo" translatable="false">+2string>    <string name="btn_addthree" translatable="false">+3string>    <string name="iv_undo">undostring>    <string name="iv_reset">resetstring>    <string name="tv_version" translatable="false">1.0 betastring>resources>

7.strings.xml(zh-rCN)

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">计分板string>    <string name="iv_reset">重置string>    <string name="iv_undo">撤销string>    <string name="tv_TeamA">A 队string>    <string name="tv_TeamAScore">A 队分数string>    <string name="tv_TeamB">B 队string>    <string name="tv_TeamBScore">B 队分数string>resources>

8.dimens.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <dimen name="teamSize">30spdimen>    <dimen name="scoreSize">60spdimen>    <dimen name="scoreSizeLand">40spdimen>resources>

9.效果图

【自学Android】使用ModelView,DataBinding,LiveData开发计分板APP(后台进程改造)_第1张图片
【自学Android】使用ModelView,DataBinding,LiveData开发计分板APP(后台进程改造)_第2张图片

更多相关文章

  1. Android进程和线程
  2. android 判断当前application 是在前台还是在后台
  3. [Android]你不知道的Android进程化(3)--进程等级
  4. Android中native进程内存泄露的调试技巧
  5. Android进程的so注入--Poison(稳定注入版)
  6. android进程创建分析
  7. Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)
  8. Android 进程间通信之LocalSocket
  9. Android进程保活

随机推荐

  1. Android文件缓存的简单应用Acache
  2. 用eclipse开发android时两个组件总是重叠
  3. Android OKhttp 上传文件袋参数
  4. 收集的一些android open source app
  5. Android(安卓)存储路径
  6. Android界面设计
  7. android带彩色下划线的tab移动导航
  8. android sdk无法更新怎么办?如何解决
  9. 几本适合新手的Android电子书(提供下载)
  10. Android屏幕切换效果实现