안드로이드 강좌 6 - Java 코드(Code)에서 뷰(View) 다루기
id
어플리케이션 실행 시에 Layout XML에서 정해진데로 View와 Layout들이 생성되고 보여집니다. 생성된 View들에서 코드상에서 동적으로 변경해야 하는 값들이 있다면, 변경해야할 View를 코드 상에서 불러오기 위해 먼저 XMl파일에서 id를 지정해야 합니다.
<TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" />
id 값은 같은 XML파일 안에서 유일하게 사용되어야 자바 코드에서 제대로 View를 가져 올 수가 있습니다.
Code
XML파일을 고쳐서 새로운 id를 추가하면 자동으로 R.java 파일이 자동으로 생성됩니다. 지정한 id가 R.id.text라는 상수로 들어가 있는 것을 확인할 수 있습니다. 이전에 말씀드렸듯이 R.java는 직접 고쳐서는 안됩니다. 만약 상수값이 제대로 들어가 있지 않은 겨우 XML파일을 다시 저장한다던지, 프로젝트를 refresh한다던지 해서 R.java가 자동으로 생성되게 하면 됩니다.
TextView t = (TextView)findViewById(R.id.text); t.setText("Hello"); t.setBackgroundColor(0xFFFF0000); t.setGravity(Gravity.LEFT);
위 코드를 setContentView한수 호출 후에 넣어주도록 합니다. setContentView에서 레이아웃 XML파일을 불러서 실제 View 객체들을 생성합니다. 그 다음 findViewById함수를 통해 생성한 View 객체를 id를 통해서 가져옵니다. 해당 View가 TextView라는 것을 알고 있으니 TextView로 Casting해줍니다. 그 다음 표시할 문자열을 바꾼다던지, 배경색을 바꾼다던지 이전에 XML에서 했던 작업과 같은 것을 자바 코드상에서 설정해줄 수 있습니다.
View.onClickListener
코드에서 View값을 변경해야할 가장 일반적인 경우는 버튼이 클릭되었을때의 처리입니다.
Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //Code } });
먼저 findViewById르 해당 Button의 객체를 코드로 불러옵니다. 그 다음 View.onClickListener이라는 Interface를 구현한 객체를 setOnClickListener를 통해서 리스너로 등록을 합니다. 그러면 실제 사용자가 버튼을 클릭했을때 해당 코드가 호출되어 실행됩니다. 클릭을 했을 때 뿐 아니라 다양한 사용자의 입력에 따라 Listener가 정의되어있고 Listener를 등록해서 각각의 경우에 대한 처리를 할 수 있도록 되어있으니 JavaDoc문서를 참고하시기 바랍니다.
예제
TextView와 Button을 화면에 표시하고 Button을 클릭했을때 "클릭됨~"이라는 메시지를 TextView에 표시하는 예제입니다.
myactivity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="버튼" /> </LinearLayout>
MyActivity.java
package kr.mobileplace.lecture; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.myactivity); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { TextView t = (TextView)findViewById(R.id.text); t.setText("클릭됨~"); t.setBackgroundColor(0xFFFF0000); t.setGravity(Gravity.LEFT); } }); } }
이제 Android 프로젝트를 생성하고 화면을 구성하고 사용자 입력에 대한 코드를 처리하는 것까지의 기본 적인 작업들을 한번씩 해보았습니다. 여기까지 실제로 이클립스로 직접 실행시키며 해보면서 전혀 몰랐던 플랫폼과 개발환경에 맛을 보셨을 겁니다. 이제 하나씩 깊이 들어가보도록 하지요.
코드를 작성하여 실행하였는데, 화면에 버튼은 나타나는데, 클릭하면 "클릭됨" 이라는 문자가 나타나야 할것 같은데,
나타나지 않네요- -;
어디가 잘못된 것일까요?
맨날 서버만 해보다가 UI가 나오는 걸 해보니 기분이 좋네요. ^^
river님// 저는 제가 강좌따라하던데다가 마지막 예제 보고 바뀐 것 같은 것만 직접 바꿔넣었더니 잘안돼서
한꺼번에 긁어서 했더니 되더라구요.
되고 나서 다시 예전꺼랑 비교해봤더니 myactivity.xml에 이상이 있었어요.
=== 아래 부분을 두 부분으로 나눠서 코딩할 수 있나요??
예를들면,
btn.setOnClickListener(XX);
XX 를 따로 클래스화 하는..등..
===============================================
btn.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
TextView t = (TextView)findViewById(R.id.text);
t.setText("clicked");
t.setBackgroundColor(11);
t.setGravity(Gravity.LEFT);
}
}
);
물론 가능합니다. 위의 예제에서 처럼 new View.OnClickListener() 뒤에 { } 속에서 메소드 재정의 하는 방식을 익명클래스라고 하는 데요, 익명 클래스는 재사용을 못하고 1회용으로 사용됩니다. 익명클래스를 사용하는 이유는 버튼같은 경우 각 버튼들은 고유의 기능을 갖게되는데 이것을 공유할 필요가 없기 때문이죠.. 만일 여러버튼들이 특정이벤트에 대해서 동일한 기능을 갖는다면 내부클래스로 따로 정의해 주고 이것을 각 버튼들에 리스너로 셋팅해 주면 될것입니다. 하지만 UI디자인관점에서 동일한 기능을 하는 버튼이 한화면에 여러게 있을 필요는 없겠죠? 저도 AWT 관련해서 들여다 본지 얼마 되지 않지만.. 아마 자바관련 서적에서 AWT 나 SWING 나온부분 보시면 도움이 좀 되실것 같습니다.
정말 잘 봤습니다 ^^
이거 하면서 간단하게 변수하나 주고 클릭됨 글씨를 생겼다가 없앨려고
if 문 줘서 했는데 안되네요
따로 Activity를 refresh 기능이 있는지 궁금하네요~
프로그램 셋팅하고 .. 이클립스 친하게 시간 보내고.. 강좌 1과 부터 참 재미있게 여기까지 왔습니다. 고맙습니다. 이젠 야전으로 출정해야 겠습니다. . 참, 후속 강좌 부탁드려요.~~
클릭했는데 이미지를 띄울려면 어떻게 해야하나요??
먼저 xml 파일에
<ImageView
<ImageView
android:id="@+id/view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
추가하고
java 파일안에서..
ImageView test=(ImageView)findViewById(R.id.view);
객체. 어떤매소드를 줘야하나요..??
>
책보다 훨씬 더 쉽고 이해가 빠르네요.. 너무너무 감사합니다. 제 블로그에 퍼갓겠습니다. http://blog.naver.com/daekkai71
휴~ 회색님의모든글을 드뎌 다 읽어보고 실습해보게 되었네요 ^^ 너무너무 유용한 정보를 주셔서 감사드립니다.
하던중 궁금한 부분이 있어 이렇게 여쭤봅니다.
1. java소스를 치던중 t.setText부분에서 t. << 바로 쩜을 치게되는순간에 팝업창이 뜨는데 그때 자꾸 버벅이더라구요
이건 컴퓨터의 사양이 미려해서 그런걸까요? 아니면 안드로이드 sdk내용이 너무 많아서그런걸까요? 혹시 관련 조작이 가능하다면
알려주시면 감사하겠습니다. ^^
2. eclipse에서 실행하게 되면 Device에 자동으로 깔리게 되는데요.
어떤때는 App 목록에 나오는데 어떤때는 실행후에 App목록에 나오지 않을때도 있구요
왜 그런 차이를 보이는지 궁금하구요 ( Main으로 등록된 부분이 실제로 처음 실행되는 부분이어서 그런것 같네요..)
3. 설치파일로 만드는 방법도 궁금하네요.. 내용이 너무 많다면..ㅠ 1번만 알려주시면 감사합니다.
위 예제를 실행중 에러가 발생하였는데.. 에뮬에서 The application layout has stopped unexpectdly.Please try again 라고 발생을 하는데 정확한 에러로그를 볼려면 어디를 찾아봐야 하나요? 버전은 1.5입니다. ^^;;