Links the UI to actual data without having to use findViewById for every item.
In build.gradle, add 'dataBinding.enabled = true':
apply plugin: 'com.android.application' android { compileSdkVersion 28 buildToolsVersion "28.0.3" ... dataBinding.enabled = true; } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.2' }Create a plain old Java object to act as a placeholder for the data:
/** * BoardingPassInfo is a simple POJO that contains information about, you guessed it, a boarding * pass! Normally, it is best practice in Java to declare member variables as private and provide * getters, but we are leaving these fields public for ease of use. */ public class BoardingPassInfo { public String passengerName; public String flightCode; public String originCode; public String destCode; public Timestamp boardingTime; public Timestamp departureTime; public Timestamp arrivalTime; public String departureTerminal; public String departureGate; public String seatNumber; public int barCodeImageResource; public long getMinutesUntilBoarding() { long millisUntilBoarding = boardingTime.getTime() - System.currentTimeMillis(); return TimeUnit.MILLISECONDS.toMinutes(millisUntilBoarding); } }Add layout as the root tag to the UI (in this case, activity_main.xml file). Android will automatically create a Binding class for any layout with these tags:
<?xml version="1.0" encoding="utf-8"?> <layout> <ScrollView xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.constraint.ConstraintLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="@string/passenger_label" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ... </android.support.constraint.ConstraintLayout> </ScrollView> </layout>In your Activity, create a Binding instance, and point the instance to the correct content view using DatabindingUtil:
public class MainActivity extends AppCompatActivity { ActivityMainBinding mBinding; // ActivityMainBinding is automatically generated based on the activity_main.xml file name @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); // Passes in the Activity and sets the content view to the correct layout file BoardingPassInfo boardingPass = generateBoardingPassInfo(); // Whatever method to produce an instance of your placeholder class populated with data displayBoardingPassInfo(boardingPass); // Passes the placeholder instance to the method below } private void displayBoardingPassInfo(BoardingPassInfo info) { mBinding.textViewPassengerName.setText(info.passengerName); mBinding.textViewFlightCode.setText(info.flightCode); mBinding.textViewOriginAirport.setText(info.originCode); mBinding.textViewDestinationAirport.setText(info.destCode); mBinding.textViewTerminal.setText(info.departureTerminal); mBinding.textViewGate.setText(info.departureGate); mBinding.textViewSeat.setText(info.seatNumber); SimpleDateFormat formatter = new SimpleDateFormat("hh:mm a", Locale.getDefault()); String boardingTime = formatter.format(info.boardingTime); mBinding.textViewBoardingTime.setText(boardingTime); String departureTime = formatter.format(info.departureTime); mBinding.textViewDepartureTime.setText(departureTime); String arrivalTime = formatter.format(info.arrivalTime); mBinding.textViewArrivalTime.setText(arrivalTime); long totalMinutesUntilBoarding = info.getMinutesUntilBoarding(); long hoursUntilBoarding = TimeUnit.MINUTES.toHours(totalMinutesUntilBoarding); long minutesMinusHoursUntilBoarding = totalMinutesUntilBoarding - (hoursUntilBoarding*60); String hoursAndMinutesUntilBoarding = hoursUntilBoarding + ":" + minutesMinusHoursUntilBoarding; mBinding.textViewBoardingInCountdown.setText(hoursAndMinutesUntilBoarding); } }ud851-Exercises-student\Lesson11-Completeing-The-UI\T11.02
