activity_main.xml
을 통한 Event handler연결이 아닌, MainActivity.java
를 통하여 Button Handling하기.기존 activity_main.xml에서 button view에 연결된 onClick Event에 연결하는 방식이 아닌 MainActivity.java에서 Click Evnet handling을 hooking하는 방식으로 수정하기.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// click event 처리하는 곳.
public void onClick_red_btn(View view){
ConstraintLayout con_layout = findViewById(R.id.lay_con);
con_layout.setBackgroundColor(Color.parseColor("red"));
}
// click event 처리하는 곳.
public void onClick_yello_btn(View view){
ConstraintLayout con_layout = findViewById(R.id.lay_con);
con_layout.setBackgroundColor(Color.parseColor("yellow"));
}
// click event 처리하는 곳.
public void onClick_green_btn(View view){
ConstraintLayout con_layout = findViewById(R.id.lay_con);
con_layout.setBackgroundColor(Color.parseColor("green"));
}
}
이 부분을 다음과 같이 수정합니다.
MainActivity Class에서 View.OnClickListener 인터페이스를 implements구문으로 추가 합니다.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
아래와 같이 빨간 줄이 나오면, 추상 Method를 구현하기 위하여,
implement methods
를 선택한다.
여기서 그냥 OK
그러면 Override
된 method가 생김.
onClick()
부분에 Event Handling을 하도록 Controll 코드를 구현.
@Override
public void onClick(View view) {
// 1. 어떤 버튼을 클릭했는지 알아야 합니다.
// view.getID로 알 수 있다.
Log.d("내꺼", "onClick: "+ view.getId());
switch (view.getId()){
case R.id.red_button:
onClick_red_btn(view);
break;
case R.id.yello_button:
onClick_yello_btn(view);
break;
case R.id.green_button:
onClick_green_btn(view);
break;
default:
break;
}
}
MainActivity class
부분도 다음과 같이 변경.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// button control을 위한 member variable추가.
Button redButton, yellButton, greenButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//View객체를 member variable과 연결하기.
redButton = findViewById(R.id.red_button);
yellButton = findViewById(R.id.yello_button);
greenButton = findViewById(R.id.green_button);
//setOnClickListener 를 통해서 onClick 매서르를 사용하도록 함.
redButton.setOnClickListener(this);
yellButton.setOnClickListener(this);
greenButton.setOnClickListener(this);
}
결과,
Button을 누르면 색이 바뀌도록 Button control이 가능하다.
View.OnClickListener
인터페이스를 상속받은다음,
setOnClickListner
를 통해 해당 MainActivity Class에서 Listener등록을 한다.
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button btn_add, btn_sub, btn_mul, btn_div;
TextView text_num1, text_num2, text_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_add = findViewById(R.id.btn_add);
btn_sub = findViewById(R.id.btn_sub);
btn_mul = findViewById(R.id.btn_mul);
btn_div = findViewById(R.id.btn_div);
// connect view_component with member variable.
btn_add.setOnClickListener(this);
btn_sub.setOnClickListener(this);
btn_mul.setOnClickListener(this);
btn_div.setOnClickListener(this);
text_num1 = findViewById(R.id.TextNumber_num1);
text_num2 = findViewById(R.id.TextNumber_num2);
text_result = findViewById(R.id.TextNumber_result);
Override
된 Interface내 Abstract method - OnClick() 함수를 정의한다. Event가 발생히 동작을 정의하면 된다.
@Override
public void onClick(View view) {
Integer num1 = Integer.parseInt(text_num1.getText().toString());
Integer num2 = Integer.parseInt(text_num2.getText().toString());
switch (view.getId()){
case R.id.btn_add:
Log.d("내꺼", "onClick:"+num1+" + "+num2);
text_result.setText(Integer.toString(num1+num2));
break;
case R.id.btn_sub:
Log.d("내꺼", "onClick:"+num1+" - "+num2);
text_result.setText(Integer.toString(num1-num2));
break;
case R.id.btn_mul:
Log.d("내꺼", "onClick:"+num1+" * "+num2);
text_result.setText(Integer.toString(num1*num2));
break;
case R.id.btn_div:
Log.d("내꺼", "onClick:"+num1+" / "+num2);
text_result.setText(Double.toString(num1/(double)num2));
break;
default:
break;
}
}
View.OnClickListener
interface 상속을 삭제한다.setOnClickListener(this)
)을 삭제한다.Onclick()
함수도 삭제한다.setOnClickListener
의 파라메터로 new View.OnClickListener(){}
을 추가한다.OnClick()
안에 Button Control 코드를 작성한다.//public class MainActivity extends AppCompatActivity implements View.OnClickListener{
public class MainActivity extends AppCompatActivity {
Button btn_add, btn_sub, btn_mul, btn_div;
TextView text_num1, text_num2, text_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_add = findViewById(R.id.btn_add);
btn_sub = findViewById(R.id.btn_sub);
btn_mul = findViewById(R.id.btn_mul);
btn_div = findViewById(R.id.btn_div);
/* // connect view_component with member variable.
btn_add.setOnClickListener(this);
btn_sub.setOnClickListener(this);
btn_mul.setOnClickListener(this);
btn_div.setOnClickListener(this);*/
text_num1 = findViewById(R.id.TextNumber_num1);
text_num2 = findViewById(R.id.TextNumber_num2);
text_result = findViewById(R.id.TextNumber_result);
// 이벤트 적용 세번째 방법 --> 익명 클래스 구현.
// 인터페이스인 리스터를 직접적으로 버튼에 구현하는 방식이다.
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//TODO: something..
Integer num1 = Integer.parseInt(text_num1.getText().toString());
Integer num2 = Integer.parseInt(text_num2.getText().toString());
Log.d("내꺼", "onClick:"+num1+" + "+num2);
text_result.setText(Integer.toString(num1+num2));
}
});
}
우선 아래와 같이 추가해 보자.
아래와 같이 파일이 추가된다.