안녕하세요? 지난번 시간에는 안드로이드 스튜디오2.1을 이용해서 버튼을 누르면 메세지가 뜨는 것까지 했습니다.

이번 시간에는 버튼의 이름을 바꾸고, 이 버튼들을 눌렀을 때 미리 지정된 특정 웹 사이트로 링크되는 것으로 구현하는 작업을 하고자 합니다.


우선 작업의 내용은 지난 시간과 거의 같습니다. 새로운 프로젝트를 생성하는데, 역시 이번에도 역시 첫번째 알파벳을 대문자로 해서, Sample5-2로 지정을 하는 것을 빼면 나머지는 같은 과정을 거쳐서 새로운 프로젝트를 생성합니다.


역시나 여기서도 res폴더 밑에 있는 layout 폴더에 들어가서, activity_main.xml파일을 더블클릭해서 열고, 다음에는 아래에 있는 Design탭을 열도록 합니다. 

그러면 언제나의 것 처럼 Hello World!라는 텍스트 상자가 있는데, 이 텍스트 상자를 delete키를 눌러서 제거하도록 하고, 옆에 있는 palette패널에서 button 컴포넌트를 끌어와서 화면 가운데 놓기를 3번 반복합니다.



위 화면과 같이 Design탭에서의 작업이 끝이 났다면, 다음에는 버튼의 이름을 각각 WEB1, WEB2, WEB3로 바꾸어 주어야 합니다. 책에서는 Text탭으로 가서 일일이 수작업으로 바꾸었지만, 저는 위 화면에 보이다 시피 Properties패널에서 TextView에서 text항목을 바꾸는 것만으로 버튼에 보이는 글씨를 바꿀 수가 있었습니다.



실제로 Design탭에의 properties란에서 바꾼 것만 가지고서, text란에서 버튼에 표시되는 텍스트가 각각 WEB1, WEB2, WEB3로 바뀌었는 것을 확인할 수가 있었습니다.


이제 다음으로 할 일은 버튼 3개를 디자인만 했을 뿐이지, 작동을 하기 위한 논리를 아직 짜 놓은 것이 아니기 때문에, 논리를 짜는 작업에 들어가야 합니다.

Java폴더 아래에 MainActivity를 더블클릭하면, java 언어로 씌여진 코딩이 났습니다. 여기다가 set(ontentView(R.layout.activity_main); 이라고 적혀 있는 줄 아래에 다음과 같이 코딩을 시작합니다.


Button button 1 = (Button)findViewById(R.id.button1);

button1.setOnClickListener(new View.OnClickListener(){

  public void onClick(View v){

  Intent myIntent = new Intent (Intent.ACTION_V IEW,Uri.parse("http://www.daum.net"));

    startActivity(myIntent);

}

});


여기서 책에는 나오지 않은 돌발 사태가 벌어졌습니다. 2번째 행에서 findViewById(R.id.button1);에서 빨간색으로 표시된 button1항목이 계속 에러가 떴다고 나오는 것이였습니다. 

저로서는 아무리 Alt + Enter 키를 눌러도 제대로 해결이 되지 않았습니다. 한참을 찾아본 후에야 그 에러가 뜬 이유를 알 수 있었는데......



위 화면에서 WEB1의 properties란에 있는 ID란을 보면, 저 스크린샷에서는 button1으로 교체를 하였습니다만, 사실은 button으로만 되어 있어서 계속 에러가 떴던 것이였습니다. 우선 WEB1을 지정하는 코딩을 하면서 정작 컴포넌트의 ID가 button1이 아니라 button으로만 되어 있으니, 코딩상으로는 무엇을 가르키는 것인지 모르는 상황이 벌어진 것입니다. 


이런 우여곡절이 있기는 했습니다만, 아무튼 어떻게 WEB1에 대한 코딩을 완료해서, 버튼을 누르면 '다음'이 뜨도록 만들어 놓았습니다. 그 다음으로 WEB2와 WEB3버튼을 누르면 각각 '네이버'와 '네이트'가 뜨도록 코딩을 진행 하도록 하였습니다.

WEB2에 관한 코딩을 다음과 같이 하였습니다.


Button button2 = (Button)findViewById(R.id.button2);

button2.setOnClickListener(new View.OnClickListener( ){
public void onClick(View v){

   Intent myIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.naver.com"));

     startActivity(myIntent);

}

});


위와 같이 코딩을 하여서 WEB2를 눌렀을 때 네이버가 뜰 수 있도록 코딩을 마치고, 마지막으로 WEB3에 대한 코딩을 아래와 같이 하였습니다.


Button button3 = (Button)findViewById(R.id.button3);

button3.setOnClickListener(new View.onClickListener( ){

public void onClick(View v){

Intent myIntent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.nate.com"));

startActivity(myIntent);

}

});


모든 코딩을 다 끝내고 나서, UBS케이블을 연결해서 갤럭시 S2로 실행시켜 본 결과입니다. 


처음 디자인 할때는 WEB1과 WEB2의 사이가 WEB3와 같았습니다만, 완성을 하고 나서 보니 이렇게 처음의 디자인과 괴리가 있다는 생각이 듭니다. 


아무튼 디자인 상으로 생긴 괴리는 괴리이고, 일단 실행을 시켰을 때, WEB1을 눌렀을 때는 다음 홈페이지가........

WEB2를 눌렀을 때는 네이버가 뜨고, WEB3를 눌렀을 때는 네이트의 홈페이지가 뜨는 것을 확인 하였습니다.


이것으로 버튼을 가지고서 하는 두번째 실습도 성공을 하였고, 어서 어서 다음 실습으로 들어가야 겠다는 생각이 듭니다.







추가 내용 : 이번 실습에서 중요한 것은 Intent였습니다. 이 Intent는 메세지 객체(messaging object)라는 것으로서, 다른 앱 

             컴포넌트로 부터 작업(action)을 요청할 수 있는 객체입니다. 이 Intent는 기본적으로 3가지 사용법이 있습니다.


1. starting activity

액티비티(activity)는 화면 하나를 의미하는데, 새로운 액티비티를 시작하기 위해서는 주로 startActivity()라는 명령어를 사용합니다.


2. starting service

서비스(service)는 유저 인터페이스 없이 백그라운드(back ground)에서 실행되는 컴포넌트입니다. 이 서비스를 실행하기 위해서는 startService()라는 명령어로 Intent를 주어서 서비스를 시작할 수 있습니다.


3. delivering a broadcast

브로드 캐스트(broadcast)는 어떤 앱이든 수신하는 메세지를 의미합니다. 즉, 시스템이나 디바이스의 변화가 일어나면, 이를 전달하는 것이라고 하는데, 이런 브로드캐스트를 전달하기 위해서는 다음과 같은 명령어로 시작합니다. sendBroadcast( )나 

sendOrderBroadcast( )를 씁니다.


이 Intent는 2가지 유형이 있습니다.

명시적 인텐트(Explicit Intents) : 클래스(class)이름 같은 이름을 지정해서 컴포넌트를 실행시킨다. 주로 사용하는 이유는 액

                                    티비티나 서비스의 이름만 알고 있으면 간단하게 사용할 수 있습니다.


암시적 인텐트(Implicit Intents) : 이름을 지정하지 않으나 일반적인 작업(general action)을 지정해서 실행시킨다. 이런 특성 

                                    때문에 다른 앱의 컴포넌트가 대신 작동해서 작업을 할 수 있다.




+ Recent posts

티스토리 툴바