안드로이드 개발 질문/답변
(글 수 45,052)
소스는 아래와 같습니다.
import android.R.string;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.LinearLayout;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String idw;
String passw;
idw =new String("School");
passw=new String("School");
final LinearLayout layout = (LinearLayout)findViewById(R.id.layout);
Toast.makeText(getBaseContext(), "Loaded OK\n"+"Hint : School", Toast.LENGTH_SHORT).show();
final EditText id =(EditText)findViewById(R.id.editText1);
final EditText pass =(EditText)findViewById(R.id.editText2);
Button login = (Button)findViewById(R.id.button1);
//id.setText("test");
login.setOnClickListener(
new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
//Toast.makeText(getBaseContext(), "입력값 : "+id.getText() + "\n"+"String = "+idw, Toast.LENGTH_SHORT).show();
if (id.getText().toString().equalsIgnoreCase("")||pass.getText().toString().equalsIgnoreCase("")){
Toast.makeText(getBaseContext(), "아이디나 비빌번호가 입력되지 않았습니다.",Toast.LENGTH_SHORT).show();
return;
}
if (idw.equalsIgnoreCase(id.getText().toString())){
if (passw.equalsIgnoreCase(pass.getText().toString())){
Toast.makeText(getBaseContext(), "Login", Toast.LENGTH_SHORT).show();
layout.setBackgroundColor(Color.rgb(0,0,255));
}
else{
Toast.makeText(getBaseContext(), "아이디나 비밀번호가 틀립니다.", Toast.LENGTH_SHORT).show();
}
}
else{
Toast.makeText(getBaseContext(), "아이디나 비밀번호가 틀립니다.", Toast.LENGTH_SHORT).show();
}
}
});
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
final에 대해서 찾아봤는데
final은 단지 Read-Only로 만드는 거라고 해서
안써도 되겠구나 하고 지웠습니다.
근데 오류가 뜹니다.
혹시 오류에 대한 간단한 설명을 들을수 있을까요?
2012.08.02 11:56:09
저도 정확히 뭐라고 설명해야되는지는 모르겠지만 ~_~
login.setOnClickListener(new OnClickListener());
new OnClickListener는 익명의 리스너를 생성하는것이죠
저녀석이 실행되는 쓰레드는 setOnClickListener의 실행 쓰레드와 다릅니다. 맞죠??
쓰레드가 다른데 객체는 참조형식으로 가져가기 때문에 수정 가능한 상태가 되면 - _- 뭔가 껄끄럽습니다.
왜냐면 저녀석들은 지역 변수 거든요!!




login.setOnClickListener 의 파라미터로 구현해 준 new onClickListener 이하를 anonymous inner class (익명의 내부클래스?) 라고 합니다.
이러한 클래스에서 외부의 변수에 접근할 때는 final만 접근 가능합니다. 글로 설명하기에는 좀 복잡하지만, 생성시간 및 접근자에 관련성이 있습니다. 자세한것은 좀더 구글링 해보시면 찾을 수 있을겁니다.