{ Android Studio } Explicit Intent & Implicit Intent View binding
Explicit Intent & Implicit Intent View binding
View Binding
-
What is View Binding
1-1. Before
-
We needed to assign variables such as TextView nameView, phoneView, and addressView … etc
-
We also needed to reference views in xml and then do operations by using findViewById
-
Time consuming and inefficient
-
View Binding is an alternative
1-2. Changes
-
3.5 version : we used findViewById
-
3.6 version : view binding
-
4.1 version : Kotlin Synthetic; can use id as an variable; only Kotlin supports and NullPointException occurs frequently –> deprecated
-
Current version: Java and Kotlin use view binding only
1-3. Difference with findViewById
-
View Binding automatically create a class, so we do not need to write id and set types
-
findViewById
-
Null error can occur when a developer use invalid id
-
Cast excepton can occur when a developer made a mistake e.g. textView type <-> imageView type
-
Speed is slower than
-
-
-
How to use
2-1. add gradle
-
Version should be higher than 3.6
-
Higher than 4.0
android { ... buildFeatures { viewBinding = true } } - 3.6 ~ 4.0 android { ... viewBinding { enabled true } }2-2. activity
Java
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); // 1 setContentView(binding.getRoot()); // 2 } private void updateUI(UserProfile userProfile){ binding.name.setText("Hyukjoo Lee"); // 3 binding.phone.setText("000-000-0000"); binding.address.setText("Burnaby, BC"); } -
}
-
ActivityMainBinding.inflate(getLayoutInflater()); inflate –> instantiate view in xml
-
Before : R.layout.activity_main After : binding.getRoot() Pass root view we created
-
access properties in the object
rule : ActivityXXXBinding
Kotlin
private lateinit var binding: ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.textView.text = "Hi"
}
}
In school class: Android Mobile App II
in build.gradle(Module:) script
android {
...
buildFeatures {
viewBinding = true
}
}
- Build Menu -> Clean Project -> Rebuild Project
this is to ensure binding class is generated
- Import binding class and do some modification
// Source Code
package com.example.converter;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.example.converter.databinding.ActivityMainBinding;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; // 1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 2
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
}
public void convertCurrency(View view) {
// Traditional ways
// EditText dollarText = findViewById(R.id.dollarText);
// TextView textView = findViewById(R.id.textView);
// dollarText.getText()... => binding.dollarText...
if(!binding.dollarText.getText().toString().equals("")){
float dollarValue = Float.parseFloat(binding.dollarText.getText().toString());
float euroValue = dollarValue * 0.85F ;
binding.textView.setText(String.format(Locale.ENGLISH, "%.2f", euroValue));
}
else {
binding.textView.setText("No Value");
}
}
}