2020. 12. 21. 21:09ㆍ개발 관련/안드로이드 스튜디오
이벤트 처리 방법
- 익명 클래스 생성
- 익명 클래스로 참조 객체 생성
- Activity가 리스너 인터페이스 상속
- View에 onClick 속성값 지정(xml)
이벤트 핸들링이란?
사용자의 특정한 행동에 대해 특정한 기능을 수행하도록 처리하는 것
안드로이드에서는 특정 이벤트 처리를 리스너를 구현함으로써 처리할 수 있다.
Button이 클릭되면 TextView의 Text 컬러 색상을 변경하는 예제를 예시로 들어보자.
레이아웃 리소스 xml
<LinearLayout
android:id="@+id/Verti_layout"
android:layout_width="368dp"
android:layout_height="495dp"
android:orientation="vertical"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World"
android:textSize="30sp"
tools:layout_editor_absoluteX="110dp"
tools:layout_editor_absoluteY="85dp" />
<LinearLayout
android:id="@+id/hori_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Red" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Blue" />
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Green" />
</LinearLayout>
</LinearLayout>
1. 익명 클래스( Anonymous Class ) 생성
리스너를 등록할 때 이벤트 처리구문을 오버라이딩 하는 방식
View 위젯간의 연관성이 적을 때 사용한다.
- 가독성이 떨어진다.
MainActivity.java
package com.example.myapplication;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Button btn_red;
Button btn_blue;
Button btn_green;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.InitializeView();
this.SetListener();
}
public void InitializeView()
{
btn_red = (Button)findViewById(R.id.btn1);
btn_blue = (Button)findViewById(R.id.btn2);
btn_green = (Button)findViewById(R.id.btn3);
textView = (TextView)findViewById(R.id.textView);
}
public void SetListener()
{
btn_red.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view)
{
textView.setTextColor(Color.RED);
}
});
btn_blue.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view)
{
textView.setTextColor(Color.BLUE);
}
});
btn_green.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view)
{
textView.setTextColor(Color.GREEN);
}
});
}
}
2. 익명 클래스( Anonymous Class )로 참조 객체 생성
리스너에 메모리를 할당할 때 이벤트 처리구문을 오버라이딩 하는 방식 - 예제와 가장 어울린다.
MainActivity.java
package com.example.myapplication;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Button btn_red;
Button btn_blue;
Button btn_green;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.InitializeView();
this.SetListener();
}
public void InitializeView()
{
btn_red = (Button)findViewById(R.id.btn1);
btn_blue = (Button)findViewById(R.id.btn2);
btn_green = (Button)findViewById(R.id.btn3);
textView = (TextView)findViewById(R.id.textView);
}
public void SetListener()
{
View.OnClickListener Listener = new View.OnClickListener(){
@Override
public void onClick(View view)
{
switch (view.getId()) {
case R.id.btn1:
textView.setTextColor(Color.RED);
break;
case R.id.btn2:
textView.setTextColor(Color.BLUE);
break;
case R.id.btn3:
textView.setTextColor(Color.GREEN);
break;
}
}
};
btn_red.setOnClickListener(Listener);
btn_blue.setOnClickListener(Listener);
btn_green.setOnClickListener(Listener);
}
}
3. Activity가 View.OnClickListener 인터페이스 상속
Activity가 리스너 인터페이스를 상속받는 방식
onClick함수를 Activity안에서 오버라이딩한다( this로 등록한다 )
해당되는 view는 activity에 강하게 종속되게 된다.
MainActivity.java
package com.example.myapplication;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_red;
Button btn_blue;
Button btn_green;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.InitializeView();
this.SetListener();
}
public void InitializeView()
{
btn_red = (Button)findViewById(R.id.btn1);
btn_blue = (Button)findViewById(R.id.btn2);
btn_green = (Button)findViewById(R.id.btn3);
textView = (TextView)findViewById(R.id.textView);
}
@Override
public void onClick(View view)
{
switch (view.getId()) {
case R.id.btn1:
textView.setTextColor(Color.RED);
break;
case R.id.btn2:
textView.setTextColor(Color.BLUE);
break;
case R.id.btn3:
textView.setTextColor(Color.GREEN);
break;
}
}
public void SetListener()
{
btn_red.setOnClickListener(this);
btn_blue.setOnClickListener(this);
btn_green.setOnClickListener(this);
}
}
4. Button View의 onClick 속성값 지정
xml 레이아웃 리소스와 java 소스 모두 사용하는 이벤트 방식
xml 파일 - Button에 onClick하면 호출 될 메소드(java 파일 내, 이곳에서는 MyOnClick)의 명칭을 입력한다.
<Button
...
android:onClick="MyOnClick"
android:text="Red" />
<Button
...
android:onClick="MyOnClick"
android:text="Blue" />
<Button
...
android:onClick="MyOnClick"
android:text="Green" />
MainActivity.java
package com.example.myapplication;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity{
Button btn_red;
Button btn_blue;
Button btn_green;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.InitializeView();
}
public void InitializeView()
{
btn_red = (Button)findViewById(R.id.btn1);
btn_blue = (Button)findViewById(R.id.btn2);
btn_green = (Button)findViewById(R.id.btn3);
textView = (TextView)findViewById(R.id.textView);
}
public void MyOnClick(View view)
{
switch (view.getId()) {
case R.id.btn1:
textView.setTextColor(Color.RED);
break;
case R.id.btn2:
textView.setTextColor(Color.BLUE);
break;
case R.id.btn3:
textView.setTextColor(Color.GREEN);
break;
}
}
}
그동안 3번을 주로 사용하고 있었는데, 인터페이스를 상속받다보니 오버헤딩이 많이발생하게 되는건가?라는 의문이들어 방식을 찾아보게 되었다.
간단하다면 2번이 상속받는 것이 아니라 객체 생성이기 때문에 성능면에서 훨씬 나아보인다. -> 뇌피셜임
참조 : lktprogrammer.tistory.com/140
'개발 관련 > 안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오] OpenAPI 데이터 받아오기 - xml parsing (0) | 2021.01.11 |
---|---|
[안드로이드 스튜디오] Fragment (0) | 2021.01.08 |
[안드로이드 스튜디오] ListView (0) | 2020.12.28 |
[안드로이드 스튜디오] Drawer layout (0) | 2020.12.23 |
[안드로이드 스튜디오] 휴대폰에 개발중인 앱 설치하기 (0) | 2020.12.21 |