【自学Android】使用ModelView,DataBinding,LiveData开发计分板APP(后台进程改造)
16lz
2021-01-23
使用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进程和线程
- android 判断当前application 是在前台还是在后台
- [Android]你不知道的Android进程化(3)--进程等级
- Android中native进程内存泄露的调试技巧
- Android进程的so注入--Poison(稳定注入版)
- android进程创建分析
- Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)
- Android 进程间通信之LocalSocket
- Android进程保活