*요약 

- 이제 findViewById()를 쓸 필요가 없다


기존에는 xml에 id를 선언하고 해당 ui를 컨트롤 하기 위해서는 클래스에 findViewById()를 무조건 해줬습니다.

다음과 같이 말이죠


activity_main.xml

<android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<TextView
android:id="@+id/tv_ShowText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/btn_GetData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="getDataButton" />

</android.support.constraint.ConstraintLayout>

MainActivity.java

private TextView mShowText = null;
private Button mGetBtn = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mShowText = (TextView) findViewById(R.id.tv_ShowText);
mGetBtn = (Button) findViewById(R.id.btn_GetData);
}

지금은 ui가 Text와 Btn밖에 없기 때문에 findViewById()를 2번만 선언하였습니다.

하지만 앱이 복잡해지고 ui 컴포넌트가 많아질경우 findViewById는 얼마나 많이 선언해줘야 할까요?



다음과 같이 개선된 방식을 사용하면 일일이 findViewById를 선언해 주지 않아도 됩니다.

1. 앱 단위 build.gradle에 dataBinding을 선언해 줍니다.

dataBinding {
enabled = true
}


2.layout xml 최상위 루트에 <layout> 태그를 넣어 줍니다.

<layout xmlns:android="http://schemas.android.com/apk/res/android"></layout>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<TextView
android:id="@+id/tv_ShowText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/btn_GetData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="getDataButton" />

</android.support.constraint.ConstraintLayout>
</layout>


3.클래스에서는 setContentView(R.layout.activity_main);-> DataBindingUtil.setContentView(this, R.layout.activity_main); 같이 변경해준다.

private ActivityMainBinding mBinding;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mBinding.tvShowText.setText("바뀐다");
}

*참고 ActivityMainBinding클래스는 실제로 없습니다. 안드로이드에서 자동적으로 만들어 줍니다.

그래서 ReBuild 하기 전까지 오류로 표시될것입니다.

하지만 따라가야할 규칙이 있습니다. 멤버변수 클래스 네임은 xml파일을 따라갑니다. 

activity_main.xml ->    ActivityMainBinding

activity_content.xml ->    ActivityContentBinding

activity_love.xml ->    ActivityLoveBinding

main_act.xml    ->    MainActBinding

love_act.xml    ->    LoveActBinding


*Fragment에서 사용법

fragment_blank.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">

<FrameLayout xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.damoa.framenttest.BlankFragment">

<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />

<WebView
android:id="@+id/test_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</FrameLayout>
</layout>

BlankFragment.java

private FragmentBlankBinding mBinding = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_blank, container, false);
mBinding.testWebview.loadUrl("https://www.google.co.kr");

return mBinding.getRoot();
}







728x90
반응형

+ Recent posts