Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Commit 54ce5cc

Browse files
1. Use Data Binding to change Layout
2. Adjust the Naming style and part of useless datablocks
1 parent 34099ec commit 54ce5cc

File tree

11 files changed

+106
-104
lines changed

11 files changed

+106
-104
lines changed

android/canonical/app/build.gradle

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-android-extensions'
4+
apply plugin: 'kotlin-kapt'
45

56
android {
67
compileSdkVersion 29
78
buildToolsVersion "29.0.3"
89

10+
buildFeatures {
11+
dataBinding true
12+
}
13+
914
defaultConfig {
1015
applicationId "com.google.samples.quickstart.canonical"
1116
minSdkVersion 16
@@ -32,11 +37,11 @@ dependencies {
3237
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
3338
implementation 'com.google.android.gms:play-services-auth:18.0.0'
3439
implementation 'com.google.android.material:material:1.1.0'
35-
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
3640
implementation 'com.google.android.gms:play-services-maps:17.0.0'
3741
implementation 'com.google.android.gms:play-services-location:17.0.0'
3842
implementation "android.arch.lifecycle:extensions:1.1.1"
3943
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
44+
kapt 'com.android.databinding:compiler:3.1.4'
4045
testImplementation 'junit:junit:4.12'
4146
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
4247
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

android/canonical/app/src/main/java/com/google/samples/quickstart/canonical/MainActivity.kt

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,9 @@
11
package com.google.samples.quickstart.canonical
22

3-
import android.content.pm.PackageManager
43
import androidx.appcompat.app.AppCompatActivity
54
import android.os.Bundle
6-
import android.util.Log
75
import androidx.fragment.app.FragmentTransaction
86
import com.google.android.material.bottomnavigation.BottomNavigationView
9-
import androidx.lifecycle.MutableLiveData
10-
import androidx.lifecycle.ViewModel
11-
12-
class StopwatchView : ViewModel(){
13-
14-
var pauseOffset = MutableLiveData<Long>(0L)
15-
var isWorking = MutableLiveData<Boolean>(false)
16-
var fragmentPauseStartTime = MutableLiveData<Long>(0L)
17-
18-
fun setPauseOffset(pause_offset_value:Long){
19-
pauseOffset.value = pause_offset_value
20-
}
21-
22-
fun setWorkingStatus(working_status:Boolean){
23-
isWorking.value = working_status
24-
}
25-
26-
fun setFragmentPauseStartTime(fragment_pause_start_time:Long){
27-
fragmentPauseStartTime.value = fragment_pause_start_time
28-
}
29-
}
307

318
class MainActivity : AppCompatActivity() {
329

@@ -42,7 +19,7 @@ class MainActivity : AppCompatActivity() {
4219
runFragment = RunFragment()
4320
supportFragmentManager
4421
.beginTransaction()
45-
.replace(R.id.fragment_layout, runFragment)
22+
.replace(R.id.fragment_container, runFragment)
4623
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
4724
.commit()
4825

@@ -54,33 +31,34 @@ class MainActivity : AppCompatActivity() {
5431
runFragment = RunFragment()
5532
supportFragmentManager
5633
.beginTransaction()
57-
.replace(R.id.fragment_layout, runFragment)
34+
.replace(R.id.fragment_container, runFragment)
5835
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
5936
.commit()
37+
true
6038
}
6139

6240
R.id.bottom_navigation_item_map -> {
6341
mapsFragment = MapsFragment()
6442
supportFragmentManager
6543
.beginTransaction()
66-
.replace(R.id.fragment_layout, mapsFragment)
44+
.replace(R.id.fragment_container, mapsFragment)
6745
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
6846
.commit()
47+
true
6948
}
7049

7150
R.id.bottom_navigation_item_profile -> {
7251
meFragment = MeFragment()
7352
supportFragmentManager
7453
.beginTransaction()
75-
.replace(R.id.fragment_layout, meFragment)
54+
.replace(R.id.fragment_container, meFragment)
7655
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
7756
.commit()
57+
true
7858
}
7959

80-
60+
else -> false
8161
}
82-
true
83-
8462
}
8563
}
8664

android/canonical/app/src/main/java/com/google/samples/quickstart/canonical/MapsFragment.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,15 @@ package com.google.samples.quickstart.canonical
22

33
import android.Manifest
44
import android.app.Activity
5-
import android.content.Intent
65
import android.content.pm.PackageManager
76
import android.location.Location
87
import androidx.fragment.app.Fragment
98

109
import android.os.Bundle
11-
import android.util.Log
1210
import android.view.LayoutInflater
1311
import android.view.View
1412
import android.view.ViewGroup
15-
import androidx.core.app.ActivityCompat
1613
import androidx.core.content.ContextCompat.checkSelfPermission
17-
import androidx.fragment.app.FragmentTransaction
1814
import com.google.android.gms.location.FusedLocationProviderClient
1915
import com.google.android.gms.location.LocationServices
2016

@@ -23,7 +19,6 @@ import com.google.android.gms.maps.GoogleMap
2319
import com.google.android.gms.maps.OnMapReadyCallback
2420
import com.google.android.gms.maps.SupportMapFragment
2521
import com.google.android.gms.maps.model.LatLng
26-
import com.google.android.gms.maps.model.Marker
2722
import com.google.android.gms.maps.model.MarkerOptions
2823

2924
class MapsFragment : Fragment() {
@@ -78,7 +73,7 @@ class MapsFragment : Fragment() {
7873
}
7974

8075

81-
private val callback = OnMapReadyCallback { googleMap ->
76+
private val mapReadyCallback = OnMapReadyCallback { googleMap ->
8277
/**
8378
* Manipulates the map once available.
8479
* This callback is triggered when the map is ready to be used.
@@ -105,6 +100,6 @@ class MapsFragment : Fragment() {
105100
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
106101
super.onViewCreated(view, savedInstanceState)
107102
val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
108-
mapFragment?.getMapAsync(callback)
103+
mapFragment?.getMapAsync(mapReadyCallback)
109104
}
110105
}

android/canonical/app/src/main/java/com/google/samples/quickstart/canonical/RunFragment.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import android.view.View
99
import android.view.ViewGroup
1010
import android.widget.Button
1111
import android.widget.Chronometer
12+
import androidx.databinding.DataBindingUtil
13+
import androidx.databinding.ViewDataBinding
1214
import androidx.lifecycle.ViewModelProviders
15+
import com.google.samples.quickstart.canonical.databinding.FragmentRunBinding
1316
import kotlinx.android.synthetic.main.fragment_run.*
1417

1518
// TODO: Rename parameter arguments, choose names that match
@@ -32,7 +35,7 @@ class RunFragment : Fragment() {
3235
private var isWorking = false
3336
private var fragmentPauseStartTime = 0L
3437

35-
private fun startStopTimer(runBtn: Button, chronometer : Chronometer) {
38+
private fun startStopTimer(chronometer : Chronometer) {
3639
isWorking = if (!isWorking) {
3740
chronometer.base = SystemClock.elapsedRealtime() - pauseOffset
3841
chronometer.start()
@@ -46,7 +49,6 @@ class RunFragment : Fragment() {
4649
stopwatchViewModel.setWorkingStatus(false)
4750
false
4851
}
49-
runBtn.setText(if (!isWorking) R.string.start else R.string.stop)
5052
}
5153

5254
override fun onCreate(savedInstanceState: Bundle?) {
@@ -69,8 +71,10 @@ class RunFragment : Fragment() {
6971
inflater: LayoutInflater, container: ViewGroup?,
7072
savedInstanceState: Bundle?
7173
): View? {
72-
// Inflate the layout for this fragment
73-
return inflater.inflate(R.layout.fragment_run, container, false)
74+
val binding : FragmentRunBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_run, container, false)
75+
binding.lifecycleOwner = this
76+
binding.stopwatchViewModel = stopwatchViewModel
77+
return binding.root
7478
}
7579

7680
companion object {
@@ -99,7 +103,7 @@ class RunFragment : Fragment() {
99103
val runBtn = view.findViewById<Button>(R.id.run_btn)
100104

101105
runBtn.setOnClickListener {
102-
startStopTimer(runBtn, chronometer)
106+
startStopTimer(chronometer)
103107
}
104108

105109
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.google.samples.quickstart.canonical
2+
3+
import androidx.lifecycle.MutableLiveData
4+
import androidx.lifecycle.ViewModel
5+
6+
class StopwatchView : ViewModel() {
7+
8+
var pauseOffset = MutableLiveData<Long>(0L)
9+
var isWorking = MutableLiveData<Boolean>(false)
10+
var fragmentPauseStartTime = MutableLiveData<Long>(0L)
11+
12+
fun setPauseOffset(pause_offset_value:Long){
13+
pauseOffset.value = pause_offset_value
14+
}
15+
16+
fun setWorkingStatus(working_status:Boolean){
17+
isWorking.value = working_status
18+
}
19+
20+
fun setFragmentPauseStartTime(fragment_pause_start_time:Long){
21+
fragmentPauseStartTime.value = fragment_pause_start_time
22+
}
23+
}

android/canonical/app/src/main/res/layout/activity_main.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
app:menu="@menu/bottom_navigation_menu" />
1717

1818
<FrameLayout
19-
android:id="@+id/fragment_layout"
19+
android:id="@+id/fragment_container"
2020
android:layout_width="match_parent"
2121
android:layout_height="0dp"
2222
app:layout_constraintBottom_toTopOf="@+id/bottom_navigation_view"
Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,54 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto"
4-
xmlns:tools="http://schemas.android.com/tools"
5-
android:layout_width="match_parent"
6-
android:layout_height="match_parent"
7-
android:orientation="vertical"
8-
tools:context=".RunFragment">
4+
xmlns:tools="http://schemas.android.com/tools">
95

10-
<!-- TODO: Update blank fragment layout -->
11-
<!-- <TextView-->
12-
<!-- android:id="@+id/textView"-->
13-
<!-- android:layout_width="match_parent"-->
14-
<!-- android:layout_height="wrap_content"-->
15-
<!-- android:gravity="center"-->
16-
<!-- android:text="This is Run Fragment"-->
17-
<!-- android:textSize="30sp"-->
18-
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
19-
<!-- app:layout_constraintTop_toTopOf="parent" />-->
6+
<data>
7+
<variable
8+
name="stopwatchViewModel"
9+
type="com.google.samples.quickstart.canonical.StopwatchView" />
10+
</data>
2011

21-
<Chronometer
22-
android:id="@+id/chronometer"
12+
<androidx.constraintlayout.widget.ConstraintLayout
2313
android:layout_width="match_parent"
24-
android:layout_height="wrap_content"
25-
android:fontFamily="sans-serif-light"
26-
android:gravity="center"
27-
android:textSize="60sp"
28-
app:layout_constraintVertical_bias="0.1"
29-
app:layout_constraintBottom_toBottomOf="parent"
30-
app:layout_constraintStart_toStartOf="parent"
31-
app:layout_constraintTop_toBottomOf="@+id/imageView" />
14+
android:layout_height="match_parent"
15+
android:orientation="vertical"
16+
tools:context=".RunFragment">
3217

33-
<Button
34-
android:id="@+id/run_btn"
35-
android:layout_width="wrap_content"
36-
android:layout_height="wrap_content"
37-
android:text="@string/start"
38-
app:layout_constraintBottom_toBottomOf="parent"
39-
app:layout_constraintEnd_toEndOf="parent"
40-
app:layout_constraintStart_toStartOf="parent"
41-
app:layout_constraintTop_toBottomOf="@+id/chronometer"
42-
app:layout_constraintVertical_bias="0.3" />
18+
<Chronometer
19+
android:id="@+id/chronometer"
20+
android:layout_width="match_parent"
21+
android:layout_height="wrap_content"
22+
android:fontFamily="sans-serif-light"
23+
android:gravity="center"
24+
android:textSize="60sp"
25+
app:layout_constraintVertical_bias="0.1"
26+
app:layout_constraintBottom_toBottomOf="parent"
27+
app:layout_constraintStart_toStartOf="parent"
28+
app:layout_constraintTop_toBottomOf="@+id/image_view" />
4329

44-
<ImageView
45-
android:id="@+id/imageView"
46-
android:layout_width="match_parent"
47-
android:layout_height="149dp"
48-
android:src="@drawable/ic_baseline_access_alarm_24"
49-
app:layout_constraintBottom_toBottomOf="parent"
50-
app:layout_constraintEnd_toEndOf="parent"
51-
app:layout_constraintStart_toStartOf="parent"
52-
app:layout_constraintTop_toTopOf="parent"
53-
app:layout_constraintVertical_bias="0.3" />
30+
<Button
31+
android:id="@+id/run_btn"
32+
android:layout_width="wrap_content"
33+
android:layout_height="wrap_content"
34+
android:text="@{stopwatchViewModel.isWorking ? @string/stop : @string/start}"
35+
app:layout_constraintBottom_toBottomOf="parent"
36+
app:layout_constraintEnd_toEndOf="parent"
37+
app:layout_constraintStart_toStartOf="parent"
38+
app:layout_constraintTop_toBottomOf="@+id/chronometer"
39+
app:layout_constraintVertical_bias="0.3" />
40+
41+
<ImageView
42+
android:id="@+id/image_view"
43+
android:layout_width="match_parent"
44+
android:layout_height="149dp"
45+
android:src="@drawable/ic_baseline_access_alarm_24"
46+
app:layout_constraintBottom_toBottomOf="parent"
47+
app:layout_constraintEnd_toEndOf="parent"
48+
app:layout_constraintStart_toStartOf="parent"
49+
app:layout_constraintTop_toTopOf="parent"
50+
app:layout_constraintVertical_bias="0.3" />
5451

5552

56-
</androidx.constraintlayout.widget.ConstraintLayout>
53+
</androidx.constraintlayout.widget.ConstraintLayout>
54+
</layout>

android/canonical/app/src/main/res/menu/bottom_navigation_menu.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
<item
44
android:id="@+id/bottom_navigation_item_run"
55
android:icon="@drawable/ic_baseline_directions_run_24"
6-
android:title="@string/navigationMenuRun" />
6+
android:title="@string/navigation_menu_run" />
77

88
<item
99
android:id="@+id/bottom_navigation_item_map"
1010
android:icon="@drawable/ic_baseline_map_24"
11-
android:title="@string/navigationMenuMap" />
11+
android:title="@string/navigation_menu_map" />
1212

1313
<item
1414
android:id="@+id/bottom_navigation_item_profile"
1515
android:icon="@drawable/ic_baseline_people_24"
16-
android:title="@string/navigationMenuMe"/>
16+
android:title="@string/navigation_menu_me"/>
1717

1818
</menu>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<color name="colorPrimary">#6200EE</color>
4-
<color name="colorPrimaryDark">#3700B3</color>
5-
<color name="colorAccent">#03DAC5</color>
3+
<color name="color_primary">#6200EE</color>
4+
<color name="color_primary_dark">#3700B3</color>
5+
<color name="color_accent">#03DAC5</color>
66
</resources>

android/canonical/app/src/main/res/values/strings.xml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
<resources>
22
<string name="app_name">Summer 2020</string>
3-
<string name="navigationMenuRun">Run</string>
4-
<string name="navigationMenuMap">Map</string>
5-
<string name="navigationMenuMe">Me</string>
6-
<!-- TODO: Remove or change this placeholder text -->
3+
<string name="navigation_menu_run">Run</string>
4+
<string name="navigation_menu_map">Map</string>
5+
<string name="navigation_menu_me">Me</string>
76
<string name="hello_blank_fragment">This is Run fragment</string>
87
<string name="stop">Stop Timer</string>
98
<string name="start">Start Timer</string>

0 commit comments

Comments
 (0)