안녕하세요 안드로이드 처음으로 해보는 초보자입니다.
사실 자바도 그리 잘하는 편이 못되서 걱정이 산더미인데 일단 부딪혀보고 있습니다. 숙련자 분들께서 좀 답답하시더라도 초보자라 그러려니 하면서 우문에 친절한 답변을 기대하며 이렇게 글을 올립니다.
질문은 약 네가지입니다.
첫번째 질문은 android xml 언어 관련하여 초보자로서 차근차근 공부를 좀 해볼 수 있는 사이트를 아시는 곳이 있다면 상세히좀 알려주시면 감사하겠습니다. 이미 '알짜만 골라 배우는 안드로이드 프로그래밍'이란 책을 사서 해보고는 있으나 부족한게 꽤 많은 듯하여 다른 공부할 수 있을만한 자료들이 절실합니다. 책의 예제 외에 다양한 상황의 예제들을 보면서 공부할 수 있을만한곳 있을까요? 설명이 덧붙여 있다면 금상첨화겠지요.
두번째 질문 부터는 이번에 제가 도전해본 계산기를 만들면서 생긴 문제에 관한 것 입니다. 일단 자바 쪽 코드는 다음과 같습니다.(main.xml은 따로 첨부하겠습니다.) 질문을 미리 써놓겠습니다. 자바 코드가 쓸데없이 좀 길어서요;; 길지만 코딩자체의 논리는 엄~~~~~~~~~~~청 간단한 거라 한번만 보셔도 아실수 있을꺼에요...(아 부끄럽네요 초보자 코딩이라 -_-;;)
일단 코딩이 긴 이유중 하나가 Button Class의 Object 생성때문인데요 버튼 하나하나마다 이렇게 일일이 객체를 따로 지정하는 수밖에 없는걸까요?
그리고 세번째 질문 코드를 보시다 보면
btn0 = (Button) findViewById(R.id.num0);
btn0.setOnClickListener(this);
위에 저 부분에서 각각의 버튼 객체에 숫자 버튼의 id를 지정하고 리스너를 설정 해주고 있는데요 이 부분도 계속 복사 붙여넣기로 길어졌는데 어레이를 만들어 for구문 돌려서 처리하듯이 한꺼번에 싹 해주는 깔끔한 방법이 없을까요? 사실 위에 생각이 안되는 이유가 findViewById안에 R.id.num<- 이 부분의 id 이름을 함수식 안에서 바꿔주는 방법을 생각하질 못하겠어서였습니다.
그리고 전체적으로 반복되는 코드들이 많은데 이를 좀 깔끔히 줄일수는 없을까요...?
네번째 질문으로 요 밑에 나올 코드 녀석이 다 되는거 같긴 하는데 calculate 부분이 안됩니다..ㅜㅜ 즉 화면에 버튼을 누르면 숫자나 operator들이 찍혀서 나오는데 다만 계산이 안되는 것이죠..오류가 뜨면서 강제로 종료한다는 식으로 에뮬레이터에서는 뜬답니다. 이유를 모르겠어요 디버깅에도 소질이..orz 좀 부탁드립니다..
package com.android.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Button;
public class testApp extends Activity implements View.OnClickListener {
String operator = null;
String memory1 = "";
String memory2 = "";
String history = "";
int ans = 0;
EditText fld;
Button btn0;
Button btn1;
Button btn2;
Button btn3;
Button btn4;
Button btn5;
Button btn6;
Button btn7;
Button btn8;
Button btn9;
Button btncal;
Button btnclr;
Button btnconvert;
Button btnp;
Button btnm;
Button btnmul;
Button btnd;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn0 = (Button) findViewById(R.id.num0);
btn0.setOnClickListener(this);
btn1 = (Button) findViewById(R.id.num1);
btn1.setOnClickListener(this);
btn2 = (Button) findViewById(R.id.num2);
btn2.setOnClickListener(this);
btn3 = (Button) findViewById(R.id.num3);
btn3.setOnClickListener(this);
btn4 = (Button) findViewById(R.id.num4);
btn4.setOnClickListener(this);
btn5 = (Button) findViewById(R.id.num5);
btn5.setOnClickListener(this);
btn6 = (Button) findViewById(R.id.num6);
btn6.setOnClickListener(this);
btn7 = (Button) findViewById(R.id.num7);
btn7.setOnClickListener(this);
btn8 = (Button) findViewById(R.id.num8);
btn8.setOnClickListener(this);
btn9 = (Button) findViewById(R.id.num9);
btn9.setOnClickListener(this);
btncal = (Button) findViewById(R.id.calculate);
btncal.setOnClickListener(this);
btnclr = (Button) findViewById(R.id.Clr);
btnclr.setOnClickListener(this);
btnp = (Button) findViewById(R.id.plus);
btnp.setOnClickListener(this);
btnm = (Button) findViewById(R.id.minus);
btnm.setOnClickListener(this);
btnmul = (Button) findViewById(R.id.multiply);
btnmul.setOnClickListener(this);
btnd = (Button) findViewById(R.id.divide);
btnd.setOnClickListener(this);
welcome();
}
public void onClick(View view) {
if (view.getId() == R.id.num0) {
ifclick(0);
}
if (view.getId() == R.id.num1) {
ifclick(1);
}
if (view.getId() == R.id.num2) {
ifclick(2);
}
if (view.getId() == R.id.num3) {
ifclick(3);
}
if (view.getId() == R.id.num4) {
ifclick(4);
}
if (view.getId() == R.id.num5) {
ifclick(5);
}
if (view.getId() == R.id.num6) {
ifclick(6);
}
if (view.getId() == R.id.num7) {
ifclick(7);
}
if (view.getId() == R.id.num8) {
ifclick(8);
}
if (view.getId() == R.id.num9) {
ifclick(9);
}
if (view.getId() == R.id.calculate) {
if (operator == null) {
ans = Integer.parseInt(memory1);
memory1 = "";
} else if (operator == "+") {
ans = Integer.parseInt(memory1) + Integer.parseInt(memory2);
history = history + "\n=" + getString(ans);
memory1 = "";
memory2 = "";
} else if (operator == "-") {
ans = Integer.parseInt(memory1) - Integer.parseInt(memory2);
history = history + "\n=" + getString(ans);
memory1 = "";
memory2 = "";
} else if (operator == "*") {
ans = Integer.parseInt(memory1) * Integer.parseInt(memory2);
history = history + "\n=" + getString(ans);
memory1 = "";
memory2 = "";
} else if (operator == "/") {
ans = Integer.parseInt(memory1) / Integer.parseInt(memory2);
history = history + "\n=" + getString(ans);
memory1 = "";
memory2 = "";
}
fld.setText(history);
}
if (view.getId() == R.id.Clr) {
history = "";
fld.setText(history);
}
if (view.getId() == R.id.plus) {
operator = "+";
history += "+";
fld.setText(history);
}
if (view.getId() == R.id.minus) {
operator = "-";
history += "-";
fld.setText(history);
}
if (view.getId() == R.id.multiply) {
operator = "*";
history += "*";
fld.setText(history);
}
if (view.getId() == R.id.divide) {
operator = "/";
history += "/";
fld.setText(history);
}
}
public void welcome() {
fld = (EditText) findViewById(R.id.window);
fld.setText("welcome~");
}
public void ifclick(int num) {
if (operator == null) {
memory1 = memory1 + num;
history = history + num;
} else {
memory2 = memory2 + num;
history = history + num;
}
fld = (EditText) findViewById(R.id.window);
fld.setText(history);
}
}
if (view.getId() == R.id.num0) {
ifclick(0);
}
이렇게 되는 코드들은 if로 하지말고 switch로 하는게 어떨까요??
switch(view.getId())
{
case R.id.num0:
{
......;
break;
}
case R.id.num1:
{
......;
break;
}
.........
}
이런식으로 하면 소스가 더 깔끔해질껍니다..속도면에서도 더 빠르겠구요...
그리고.....
btn0 = (Button) findViewById(R.id.num0);
btn0.setOnClickListener(this);
이부분들 있잖아요...
버튼이랑 아이디랑 둘다 Array에 넣어서 하면 될꺼같은데요??
그럼 for문 써서도 충분히 가능합니다.
방금 테스트 해봤는데요.
Button[] mButton = new Button[3];
이런 문장이 가능하네요....ㄷㄷㄷ;;
2.0에서 테스트했습니다.