본문으로 바로가기

안드로이드 어플리케이션 만들기 4주차 


- 앞으로 1주일마다 혹은 중간중간 업데이트 사항이 있을 때마다 포스팅 할 예정입니다.

(내용에 틀린부분이 있으면 지적 꼭 부탁드립니다 ! 개발 초보라 제가 이해한 대로 쓰고 있으니 꼭 지적 부탁드립니다.)

------------ 취직 관계로 잠정적 중단하였습니다 ----------------


NumberPicker 설정하기

1) XML파일 에서 numberpicker를 3개 끌어다 놓습니다. (횟수, 중량, 세트) id값을 잘 설정해줍니다.

2) private NumberPicker 변수를 3개 설정합니다. 

3) onCreate() 내부에서 numberpicker들을 설정해줍니다.

numberPicker1 = (NumberPicker)findViewById(R.id.numberPicker1);
numberPicker1.setMaxValue(50);
numberPicker1.setMinValue(1);
numberPicker1.setValue(15);

-WriteActivity.class

4) 각각 위에서부터 최대값, 최소값, 초기값 설정입니다.



운동이름 목록을 볼 Spinner 설정하기

개인적으로 리스트뷰나 스피너처럼 어댑터를 만들어서 넣어주는게 제일 복잡한 것 같습니다. ( +리스너...) 물론 다른게 구현하기 쉽기 때문에 비교적으로 어렵게 느껴지는 거 같긴 합니다.

운동 이름 목록을 볼 Spinner는 초기에는 초기값이 없고, 따로 버튼을 만들어서 운동이름을 입력 받고, 입력받은 값들이 Spinner에 나타나게 할 것입니다.

(원래는 Spinner에 입력하기칸을 만들고 누르면 입력하기 Dialog를 띄우려고 했는데, Spinner의 onItemSelectedListener()의 경우 '선택'되었을 때 이벤트가 발생하는것을 사용하기 때문에, 초기값이 계속 선택된 것으로 적용되어서... 찾아보았지만 Spinner의 한계로 느껴져서 일단은 보류하고 버튼으로 간단하게 했습니다. 플래그 같은 걸 쓰면 어떻게 할 수 있을거 같긴 한데, 투자시간대비 비효율적으로 느껴져서 보류합니다. )

1) 일단 스피너를 만들어 봅니다. XML 파일에서 끌어서 만들고 id값을 확인합니다.

2) 스피너에 연결할 ArrayList를 두개 만듭니다. 하나는 기본값이 들어가있고, 하나는 추가되는 목록이 들어갈 것입니다.

(앱을 새로 실행해도 데이터가 남아있어야 하므로, 운동이름목록은 추후 DB로 변경 예정입니다.)

ArrayList<String> exer_name = new ArrayList<String>();
ArrayList<String> exer_default = new ArrayList<String>();

-WriteActivity.class

3) 액티비티가 실행될 때 조건문을 통해 스피너에 출력되는 상황이 계속 변동되므로(기본값 또는 목록에 추가된 내용들) 메소드를 만들고, onCreate() 내부에 메소드를 넣어주어 목록이 계속 새로고침 되게 만들어 줍니다.

public void refresh_Exername() {
//exer_default 설정
if(exer_default.size()==0){
exer_default.add("입력 후 사용해주세요");

}

//운동 이름 array(exer_name)가 비어있다면 기본값을 띄워주고, 아니라면 목록을 띄워줌
if(exer_name.size()==0){
ArrayAdapter<String> aa = new ArrayAdapter<String> (this,
android.R.layout.simple_spinner_item ,
exer_default);
// Spinner를 선언하고 main.xml에 선언한 Spinner 객체로 초기화
Spinner sp = (Spinner)findViewById(R.id.spinner);
sp.setAdapter(aa);
}

else {
//String형을 관리하는 ArrayAdapter 선언,정의
//this = activity context
// android.R.layout.simple_spinner_item: 안드로이드 라이브러리에 기본으로 내장된 spinner item을 위한 layout 리소스 파일
// exer_name: spinner item list에 뿌려질 실제 data (운동목록)

ArrayAdapter<String> aa = new ArrayAdapter<String> (this,
android.R.layout.simple_spinner_item ,
exer_name);
// Spinner를 선언하고 main.xml에 선언한 Spinner 객체로 초기화
Spinner sp = (Spinner)findViewById(R.id.spinner);
sp.setAdapter(aa);
}

}

-WriteActivity.class

저는 refresh_Exername()으로 만들었습니다. 크게 3부분 입니다. (코드가 많이 지저분하네요. 반복되는 부분은 합칠 수 있을 것 같습니다.)

-1) 기본값 ArrayList가 비어있다면 기본값을 넣어주기

-2) 만약 운동 이름 ArrayList가 비어있다면(아직 추가되지 않았다면) ArrayAdapter에 exer_default를 넣고 스피너에서 띄워준다.

-3) 만약 운동 이름 ArrayList에 값이 있다면 ArrayAdapter에 exer_name을 넣고 스피너에서 띄워준다. 


4)onCreate()내부에 refresh_exer(); 을 적어줍니다.

운동이름 추가 버튼 만들기

1) XML 파일에서 버튼을 하나 추가해줍니다. 

2) Activity에서 EditText 하나를 선언해줍니다. 

EditText ed_id;

-WriteActivity.class

3) exername_popup.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"
android:padding="5pt" >

<EditText
android:id="@+id/ed_id"
android:layout_marginTop="10dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>

</EditText>


</LinearLayout>

-exername_popup.xml

EditText의 id를 잘 설정해둡니다. 

4) Activity에서 addExer_name() 함수를 하나 만들어줍니다.

public void addExer_name(View v){
LinearLayout linear = (LinearLayout) View.inflate(this,
R.layout.exername_popup, null);

ed_id = (EditText) linear.findViewById(R.id.ed_id);

new AlertDialog.Builder(this).setTitle("추가").setView(linear)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
exer_name.add(ed_id.getText().toString());
Toast.makeText(getApplicationContext(),ed_id.getText().toString(), Toast.LENGTH_SHORT).show();
refresh_Exername();
}
}).setNegativeButton("취소", null).show();
}

-WriteActivity.class

잘보면 처음에 exername_popup.xml을 inflate시키는 것을 볼 수 있습니다.

ed_id를 구현해주고, 코드를 잘 보면 AlertDialog.Builder에서 확인버튼을 눌렀을 때, onClick()으로 원하는 행동을 할 수 있게 해줍니다. 

저는 3가지(ed_id에 적힌 값을 exer_name에 add하기, Toast 메시지 띄워주기, refresg_Exername() 다시 실행하기)를 통해 확인 버튼을 누르면 자동으로 스피너가 새로고침이 되도록 만들었습니다.

지니모션으로 실행하면 스피너에 초기값이 들어있다가 버튼을 눌러 운동이름을 추가해주면, 운동이름 목록이 나오는 것을 확인 할 수 있습니다.




이제 데이터베이스 연동 + 메인 Activity에 입력값들이 나오게 하면 프로그래밍은 완성입니다. (디자인 수정이 남았습니다.)

데이터베이스를 Realm을 이용해서 하려는데 과연 잘 될지, 이번 주말내로 끝내봐야겠습니다.


------------ 취직 관계로 잠정적 중단하였습니다 ----------------