이번 프로젝트에서 안드로이드 앱 구현을 해야 했었습니다.
그전에 잠깐 안드로이드 코드를 본 적은 있으나 구현은 처음으로 안드로이드를 다루어 보는데 안드로이드 버튼 구현 과정에서 버튼 리스너를 사용하는 방법을 찾아보는 과정에서 코드를 보니 무명 클래스 코드 예제만 나와있어서 버튼 리스너를 사용하는 방식은 이러한 방법밖에 없나 해서 버튼 리스너를 상속받아 실행하는 코드를 구현해 보았습니다.
구현에 앞서 코드를 먼저 분석해 보았습니다.
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button Button1 = (Button) findViewById(R.id.btn1);
Button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), SubActivity.class);
startActivity(intent);
}
});
}
}
일단 public class MainActivity extends AppCompatActivity
이 문장의 뜻은 "MainActivity
라는 클래스를 만드는데 AppCompatActivity
라는 클래스에서 상속을 받는다" 라는 뜻이다.
다음에 @Override는 상속받은 함수를 재정의 한다는 뜻이다. 그럼 여기서 재정의 하는 것은 무엇인가? 바로 protected void onCreate(Bundle savedInstanceState)
onCreate라는 함수를 재정의 하는 것이다.
super.onCreate(savedInstanceState);
, setContentView(R.layout.activity_main);
이 두 문장은 지금은 딱히 해석할 이유가 없으니 넘어가겠습니다.
Button Button1 = (Button) findViewById(R.id.btn1);
이 문장은 "Button1이라는 Button 변수를 만들어 xml에서 생성한 btn1이라는 아이디의 객체를 가져와 넣는다."라는 뜻입니다.
그리고 마지막 문제의 무명 객체입니다.
Button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), SubActivity.class);
startActivity(intent);
}
});
이 무명 클래스를 해석해 본다면 Button1
에 setOnClickListener
라는 함수에서 View
에 OnClickListener()
라는 객체를 생성한 뒤 그 안에 onClick
이라는 함수를 재정의 합니다.
그리고 onClick
함수는 intent
라는 Intent
변수를 만들고 Intent
클래스에 getApplicationContext()
와 SubActivity.class
를 넘기고 Intent
객체를 만들어 넣고, startActivity
에 intent
변수를 넘겨주며 끝이 납니다.
자 그럼 코드 해석은 끝이 났습니다. 이제 저 더러운 무명 객체를 외부 클래스로 빼보겠습니다.
일단 우리가 할 일은 버튼은 클릭하면 SubActivity
라는 화면으로 넘어가는 것입니다.
그럼 저 무명 객체를 외부로 빼내려면 무엇을 해야 하는지 보면 일단 저 View.OnClickListener
를 상속받아야겠네요. 그리고 새로운 intent
를 생성해야 하는데 getApplicationContext()
, SubActivity.class
를 넘겨줘야 하네요. 자 이제 끝입니다.
코딩에 들어가 보죠
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button Button1 = (Button) findViewById(R.id.btn1);
Button1.setOnClickListener(new nextPageListener(this, SubActivity.class));
}
}
nextPageListener.java
public class nextPageListener implements View.OnClickListener{
private AppCompatActivity activ;
private Class nextPage;
public nextPageListener(AppCompatActivity activ, Class nextPage){
this.activ = activ;
this.nextPage = nextPage;
}
@Override
public void onClick(View view){
Intent intent = new Intent(this.activ.getApplicationContext() , this.nextPage);
this.activ.startActivity(intent);
}
}
완성됐습니다.
MainActivity.java
를 보면 깔끔하지 않나요? 정말 읽기 편해졌습니다. 그뿐만 아니라 코드 재사용성도 높아졌습니다.
nextPageListener.java
를 보시면 제가 앞에서 설명한 부분을 구현해냈습니다.
View.OnClickListener
를 상속받아와 클래스를 만들고 생성자를 만들어 생성될 때 AppCompatActivity
와 Class
를 상속받습니다. 그리고 onClick 함수는 똑같이 구현했습니다.
앞에서 코드 설명을 많이 해서 코드를 많이 설명하지는 않겠습니다. 혹시 궁금한 사항이 있다면 댓글을 남겨주시면 대답해 드리겠습니다.