TextView / ProgressBar / SeekBar / RatingBar
2022. 10. 10. 15:44ㆍDev.Program/Android
728x90
======== 0617_ch06_Reservation_App
> p10
< activity_main.xml >
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Chronometer android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/chrono" android:textSize="30sp" android:gravity="center" android:format="예약에 걸린 시간 %s"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnStart" android:text="예약시작" android:textSize="20sp"/> </LinearLayout> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/rGroup"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rbCalendar" android:text="날짜 설정 (캘린더뷰)" android:textSize="20sp"/> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rbTime" android:text="시간 설정" android:textSize="20sp"/> </RadioGroup> <!-- 한 공간에 여러 위젯을 겹쳐서 담기 위해 FrameLayout 사용--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <CalendarView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/calendarView"/> <TimePicker android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/timePicker"/> </FrameLayout> </LinearLayout> </LinearLayout> |
- 겹쳐보임
< activity_main.xml >
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Chronometer android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/chrono" android:textSize="30sp" android:gravity="center" android:format="예약에 걸린 시간 %s"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnStart" android:text="예약시작" android:textSize="20sp"/> </LinearLayout> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/rGroup"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rbCalendar" android:text="날짜 설정 (캘린더뷰)" android:textSize="20sp"/> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rbTime" android:text="시간 설정" android:textSize="20sp"/> </RadioGroup> <!-- 한 공간에 여러 위젯을 겹쳐서 담기 위해 FrameLayout 사용--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <CalendarView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/calendarView"/> <TimePicker android:layout_width="match_parent" android:layout_height="wrap_content" android:timePickerMode="spinner" android:id="@+id/timePicker"/> </FrameLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnOk" android:text="예약완료" android:textSize="20sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvYear" android:textSize="20sp" android:text="0000"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="년"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvMonth" android:textSize="20sp" android:text="00"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="월"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvDay" android:textSize="20sp" android:text="00"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="일"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvHour" android:textSize="20sp" android:text="00"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="시"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvMin" android:textSize="20sp" android:text="00"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="분 예약됨"/> </LinearLayout> </LinearLayout> |
- TimePicker 모드 spinner 로 변경, 각 id 값 달아주기!
< MainActivity.java >
package com.example.a0617_ch06_reservation_app; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.Button; import android.widget.CalendarView; import android.widget.Chronometer; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.TimePicker; public class MainActivity extends AppCompatActivity { Chronometer chrono; RadioGroup rGroup; RadioButton rbCalendar, rbTime; CalendarView calendarView; TimePicker timePicker; Button btnStart, btnOk; TextView tvYear, tvMonth, tvDay, tvHour, tvMin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); chrono = findViewById(R.id.chrono); rGroup = findViewById(R.id.rGroup); rbCalendar = findViewById(R.id.rbCalendar); rbTime = findViewById(R.id.rbTime); calendarView = findViewById(R.id.calendarView); timePicker = findViewById(R.id.timePicker); btnStart = findViewById(R.id.btnStart); btnOk = findViewById(R.id.btnOk); tvYear = findViewById(R.id.tvYear); tvMonth = findViewById(R.id.tvMonth); tvDay = findViewById(R.id.tvDay); tvHour = findViewById(R.id.tvHour); tvMin = findViewById(R.id.tvMin); } } |
- 각 아이디 값 들고오기
< activity_main.xml >
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <CalendarView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/calendarView"/> <TimePicker android:layout_width="match_parent" android:layout_height="wrap_content" android:timePickerMode="spinner" android:id="@+id/timePicker"/> </FrameLayout> </LinearLayout> |
- 다음 거 크기 채운 나머지를 다 먹음!
- <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
> layout_weight="1" ★
- 이 코드는 사용 할 일이 많으니 기억해두기!
- 여기서 캘린더와 타임피커에 visible=”invisible”속성(사라지되 자리는 채움)해도 되지만 우린 자바코드에서 할 것!
< MainActivity.java >
calendarView.setVisibility(View.INVISIBLE); timePicker.setVisibility(View.INVISIBLE); |
package com.example.a0617_ch06_reservation_app; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.widget.Button; import android.widget.CalendarView; import android.widget.Chronometer; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.TimePicker; public class MainActivity extends AppCompatActivity { Chronometer chrono; RadioGroup rGroup; RadioButton rbCalendar, rbTime; CalendarView calendarView; TimePicker timePicker; Button btnStart, btnOk; TextView tvYear, tvMonth, tvDay, tvHour, tvMin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("예약앱"); // 크로노미터 chrono = findViewById(R.id.chrono); // 버튼 btnStart = findViewById(R.id.btnStart); btnOk = findViewById(R.id.btnOk); // 라디오그룹 및 버튼 2개 rGroup = findViewById(R.id.rGroup); rbCalendar = findViewById(R.id.rbCalendar); rbTime = findViewById(R.id.rbTime); // FrameLayout 내의 위젯 2개 calendarView = findViewById(R.id.calendarView); timePicker = findViewById(R.id.timePicker); // 텍스트뷰 연,월,일,시,분 숫자 tvYear = findViewById(R.id.tvYear); tvMonth = findViewById(R.id.tvMonth); tvDay = findViewById(R.id.tvDay); tvHour = findViewById(R.id.tvHour); tvMin = findViewById(R.id.tvMin); // RadioGroup, CalendarView 와 TimePicker 위젯을 숨김 처리(단, 기존의 위치는 그대로 유지) rGroup.setVisibility(View.INVISIBLE); calendarView.setVisibility(View.INVISIBLE); timePicker.setVisibility(View.INVISIBLE); // 예약시작 버튼 클릭 시 크로노미터 동작 btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // START 버튼 클릭 시 크로노미터의 시각을 0분 0초로 초기화 chrono.setBase(SystemClock.elapsedRealtime()); // 시간 초기화 chrono.setTextColor(Color.RED); chrono.start(); // RadioGroup 숨김 처리 해제 rGroup.setVisibility(View.VISIBLE); } }); // RadioButton 선택 시 해당 위젯 표시 rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rbCalendar : // 날짜설정 선택 시 CalendarView 표시(TimePicker 숨김) calendarView.setVisibility(View.VISIBLE); timePicker.setVisibility(View.INVISIBLE); break; case R.id.rbTime : // 시간설정 선택 시 TimePicker 표시(CalendarView 숨김) calendarView.setVisibility(View.INVISIBLE); timePicker.setVisibility(View.VISIBLE); } } }); // 예약완료 버튼 클릭 시 크로노미터 정지 btnOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chrono.stop(); chrono.setTextColor(Color.BLUE); } }); } } |
// CalendarView 날짜 변경 시 동작하는 이벤트 처리 calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { @Override public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) { // 선택된 날짜 정보가 파라미터로 전달됨 => 각 변수에 저장 Toast.makeText(MainActivity.this, year + "년" + (month+1) + "월" + dayOfMonth + "일", Toast.LENGTH_SHORT).show(); selectedYear = year; selectedMonth = month + 1; selectedDay = dayOfMonth; } }); |
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { Toast.makeText(MainActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show(); } }); |
- 이렇게도 할 수 있으나 스크롤로 변경되면 너무 자주 호출되기 때문에 비효율적!
- ⇒ TimePicker 에 대한 변경이 있을 때 리스너 동작시킬 수 있으나 Spinner 모드에서 특히 변경되는 항목이 스크롤로 인해 많으므로 자주 호출됨(비효율적)
// 예약완료 버큰 클릭 시 크로노미터 정지 btnOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chrono.stop(); chrono.setTextColor(Color.BLUE); // 선택된 날짜 및 시각 정보를 TextView 에 출력 // 단, 날짜 정보가 선택되지 않은 경우 알림 출력 후 작업 수행하지 않음 if(selectedYear == 0 || selectedMonth == 0 || selectedDay == 0) { Toast.makeText(MainActivity.this, "날짜 선택 필수!", Toast.LENGTH_SHORT).show(); calendarView.setVisibility(View.VISIBLE); timePicker.setVisibility(View.INVISIBLE); rbCalendar.setChecked(true); rbTime.setChecked(false); return; } } }); |
// 선택된 날짜, 시각 정보를 TextView 에 각각 표시 // => 날짜 정보는 멤버변수(selectedXXX) 에 저장되어 있지만 // 시각 정보는 TimePicker 에서 가져와야함 // 저장된 날짜 정보 표시 tvYear.setText(selectedYear + ""); // int -> String 변환 필요 tvMonth.setText(selectedMonth + ""); tvDay.setText(selectedDay + ""); // TimePicker 에서 선택된 시각 정보를 TextView 에 표시 // => API Level 23 미만에서는 getCurrentHour(), 23 부터는 getHour() 사용 tvHour.setText(timePicker.getCurrentHour() + ""); tvMin.setText(timePicker.getCurrentMinute() + ""); |
- getHour() 는 23버전(마쉬멜로우) 이상부터 가능!
// CalendarView 와 TimePicker 의 정보 초기화(현재 날짜 및 시각으로 설정) calendarView.setDate(System.currentTimeMillis()); // 시스템 현재 시각정보(날짜포함) timePicker.setCurrentHour(new Date().getHours()); timePicker.setCurrentMinute(new Date().getMinutes()); |
- 23버전 이상부터는 setCurrentXXX 대신 setHour(), setMinute() 사용 가능
- 23버전 이상부터는 new Date().getXXX() 대신 Local 사용 가능
< MainActivity.java >
package com.example.a0617_ch06_reservation_app; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.widget.Button; import android.widget.CalendarView; import android.widget.Chronometer; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; import java.util.Date; public class MainActivity extends AppCompatActivity { Chronometer chrono; RadioGroup rGroup; RadioButton rbCalendar, rbTime; CalendarView calendarView; TimePicker timePicker; Button btnStart, btnOk; TextView tvYear, tvMonth, tvDay, tvHour, tvMin; int selectedYear, selectedMonth, selectedDay; // CalendarView 날짜 클릭 시 정보를 저장할 변수 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("예약앱"); // 크로노미터 chrono = findViewById(R.id.chrono); // 버튼 btnStart = findViewById(R.id.btnStart); btnOk = findViewById(R.id.btnOk); // 라디오그룹 및 버튼 2개 rGroup = findViewById(R.id.rGroup); rbCalendar = findViewById(R.id.rbCalendar); rbTime = findViewById(R.id.rbTime); // FrameLayout 내의 위젯 2개 calendarView = findViewById(R.id.calendarView); timePicker = findViewById(R.id.timePicker); // 텍스트뷰 연,월,일,시,분 숫자 tvYear = findViewById(R.id.tvYear); tvMonth = findViewById(R.id.tvMonth); tvDay = findViewById(R.id.tvDay); tvHour = findViewById(R.id.tvHour); tvMin = findViewById(R.id.tvMin); // RadioGroup, CalendarView 와 TimePicker 위젯을 숨김 처리(단, 기존의 위치는 그대로 유지) rGroup.setVisibility(View.INVISIBLE); calendarView.setVisibility(View.INVISIBLE); timePicker.setVisibility(View.INVISIBLE); // 예약시작 버튼 클릭 시 크로노미터 동작 btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // START 버튼 클릭 시 크로노미터의 시각을 0분 0초로 초기화 chrono.setBase(SystemClock.elapsedRealtime()); // 시간 초기화 chrono.setTextColor(Color.RED); chrono.start(); // RadioGroup 숨김 처리 해제 rGroup.setVisibility(View.VISIBLE); // CalendarView 와 TimePicker 의 정보 초기화(현재 날짜 및 시각으로 설정) calendarView.setDate(System.currentTimeMillis()); // 시스템 현재 시각정보(날짜포함) timePicker.setCurrentHour(new Date().getHours()); timePicker.setCurrentMinute(new Date().getMinutes()); } }); // RadioButton 선택 시 해당 위젯 표시 rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rbCalendar : // 날짜설정 선택 시 CalendarView 표시(TimePicker 숨김) calendarView.setVisibility(View.VISIBLE); timePicker.setVisibility(View.INVISIBLE); break; case R.id.rbTime : // 시간설정 선택 시 TimePicker 표시(CalendarView 숨김) calendarView.setVisibility(View.INVISIBLE); timePicker.setVisibility(View.VISIBLE); } } }); // CalendarView 날짜 변경 시 동작하는 이벤트 처리 calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { @Override public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) { // 선택된 날짜 정보가 파라미터로 전달됨 => 각 변수에 저장 // Toast.makeText(MainActivity.this, year + "년" + (month+1) + "월" + dayOfMonth + "일", Toast.LENGTH_SHORT).show(); selectedYear = year; selectedMonth = month + 1; selectedDay = dayOfMonth; } }); // TimePicker 에 대한 변경이 있을 때 리스너 동작시킬 수 있으나 // Spinner 모드에서 특히 변경되는 항목이 스크롤로 인해 많으므로 자주 호출됨 => 비효율적 // timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { // @Override // public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // Toast.makeText(MainActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show(); // } // }); // 예약완료 버튼 클릭 시 크로노미터 정지 btnOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chrono.stop(); chrono.setTextColor(Color.BLUE); // 선택된 날짜 및 시각 정보를 TextView 에 출력 // 단, 날짜 정보가 선택되지 않은 경우 알림 출력 후 작업 수행하지 않음 if(selectedYear == 0 || selectedMonth == 0 || selectedDay == 0) { Toast.makeText(MainActivity.this, "날짜 선택 필수!", Toast.LENGTH_SHORT).show(); calendarView.setVisibility(View.VISIBLE); timePicker.setVisibility(View.INVISIBLE); rbCalendar.setChecked(true); rbTime.setChecked(false); return; } // 선택된 날짜, 시각 정보를 TextView 에 각각 표시 // => 날짜 정보는 멤버변수(selectedXXX) 에 저장되어 있지만 // 시각 정보는 TimePicker 에서 가져와야함 // 저장된 날짜 정보 표시 tvYear.setText(selectedYear + ""); // int -> String 변환 필요 tvMonth.setText(selectedMonth + ""); tvDay.setText(selectedDay + ""); // TimePicker 에서 선택된 시각 정보를 TextView 에 표시 // => API Level 23 미만에서는 getCurrentHour(), 23 부터는 getHour() 사용 tvHour.setText(timePicker.getCurrentHour() + ""); tvMin.setText(timePicker.getCurrentMinute() + ""); } }); } } |
- 최종 코드
// 크로노미터 클릭 시 크로노미터 동작 chrono.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 크로노미터 상태가 저장된 변수 isChronoStart 판별 if(!isChronoStart) { chrono.setBase(SystemClock.elapsedRealtime()); // 시간 초기화 chrono.setTextColor(Color.RED); chrono.start(); isChronoStart = true; } else { chrono.setTextColor(Color.BLUE); chrono.stop(); isChronoStart = false; } } }); |
- 크로노를 클릭했을 때 동작하게끔도 가능하다! (멤버변수로 boolean isChronoStart; 추가)
- 이 부분을 클릭했을 때 예약시작과 동일한 결과를 가짐(다시 누르면 멈춤)
======== 0617_ch06_AutoCompleteTextView
p22
< AutoCompleteTextView >
< activity_main.xml >
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <AutoCompleteTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/autoCompleteTextView" android:completionHint="선택하세요" android:completionThreshold="2" android:hint="자동완성텍스트뷰"/> <MultiAutoCompleteTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/multiAutoCompleteTextView" android:completionHint="선택하세요" android:completionThreshold="2" android:hint="멀티자동완성텍스트뷰"/> </LinearLayout> |
< MainActivity.java >
- 여기서의 android. 은 생략하면 안됨! (나오는 게 달라짐)
package com.example.a0617_ch06_autocompletetextview; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.MultiAutoCompleteTextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AutoCompleteTextView auto = findViewById(R.id.autoCompleteTextView); MultiAutoCompleteTextView multi = findViewById(R.id.multiAutoCompleteTextView); // 자동 완성에 사용할 텍스트 데이터를 String 타입 배열로 생성 String[] items = {"Coffee", "Computer", "Laptop", "Radio", "Robot", "Love"}; // AutoCompleteTextView 설정 // 1. ArrayAdapter 객체 생성 => 제네릭타입 String 지정(자동 완성에 사용될 데이터의 타입) // => 파라미터 1) 현재 컨텍스트 전달 // => 파라미터 2) android.R.layout.XXX 형태로 자동완성 텍스트가 표시될 형식(레이아웃)을 가져오기 // => 파라미터 3) 목록으로 사용할 데이터가 저장된 객체(String[] 또는 List 객체 등) ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_dropdown_item_1line, items ); // 2. AutoCompleteTextView 객체의 setAdapter() 메서드를 호출하여 ArrayAdapter 객체를 전달 auto.setAdapter(adapter); } } |
< MultiAutoCompleteTextView >
// ----------------- MultiAutoCompleteTextView 설정 ----------------- // 1. ArrayAdapter 객체 생성(위에서 생성한 ArrayAdapter 객체가 있으므로 생략) // 2. MultiAutoCompleteTextView.CommaTokenizer 객체 생성 MultiAutoCompleteTextView.CommaTokenizer token = new MultiAutoCompleteTextView.CommaTokenizer(); // 3. MultiAutoCompleteTextView 객체의 setTokenizer() 메서드에 CommaTokenizer 객체 전달 multi.setTokenizer(token); // 4. MultiAutoCompleteTextView 객체의 setAdapter() 메서드를 호출하여 ArrayAdapter 객체를 전달 multi.setAdapter(adapter); |
- 하나 선택하면 뒤에 자동으로 콤마가 찍힘!
- 보통은 AutoCompleteTextView 를 많이 씀
> 다른 방법
List<String> itemList = Arrays.asList(items); // String[] -> List 타입으로 변경
- 임포트 안된 건 Alt + Enter 치면 자동 임포트
// ----------------- MultiAutoCompleteTextView 설정 ----------------- List<String> itemList = Arrays.asList(items); // String[] -> List 타입으로 변경(alt+엔터치면 임포트) // 1. ArrayAdapter 객체 생성(위에서 생성한 ArrayAdapter 객체가 있으므로 생략) ArrayAdapter<String> adapter2 = new ArrayAdapter<String>( this, android.R.layout.simple_dropdown_item_1line, itemList ); // 2. MultiAutoCompleteTextView.CommaTokenizer 객체 생성 MultiAutoCompleteTextView.CommaTokenizer token = new MultiAutoCompleteTextView.CommaTokenizer(); // 3. MultiAutoCompleteTextView 객체의 setTokenizer() 메서드에 CommaTokenizer 객체 전달 multi.setTokenizer(token); // 4. MultiAutoCompleteTextView 객체의 setAdapter() 메서드를 호출하여 ArrayAdapter 객체를 전달 multi.setAdapter(adapter2); |
- 이렇게 바꿔보기!
- 결과는 똑같다
======== 0617_ch06_ProgressBar_SeekBar_RatingBar
p.25
activity_main.xml 에서 Textview 지우고 Linear 레이아웃으로 바꾸기
> 디자인 탭에 가보면 왼쪽 Palette 에
- 이렇게 ProgressBar_SeekBar_RatingBar 있음
> 우측 Common 탭에
- orientation 바꿀 수 있음
- 끌어다 놓기
- horizon~ 바꾸기
- 미리보기 화면
- 미리보기 화면(다운받고 있는 거 이런걸로 구분가능)
< ProgressBar >
< activity_main.xml >
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ProgressBar android:id="@+id/progressBar" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="50" android:secondaryProgress="80" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnStart" android:text="시작" android:textSize="20sp"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnStop" android:text="종료" android:textSize="20sp"/> </LinearLayout> </LinearLayout> |
< MainActivity.java >
> id 가져오기
ProgressBar progressBar = findViewById(R.id.progressBar); progressBar.setProgress(0); progressBar.setSecondaryProgress(50); |
- 보여준 후에 자바코드를 줬기 때문에 자바코드가 최종적으로 보여짐
Button btnStart = findViewById(R.id.btnStart); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProgressDialog dialog = new ProgressDialog(MainActivity.this); } }); |
- 이벤트 내부기 때문에 클래스명.this
< MainActivity.java >
Button btnStart = findViewById(R.id.btnStart); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProgressDialog dialog = new ProgressDialog(MainActivity.this); dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage("데이터 확인 중"); dialog.show(); } }); |
- 다이얼로그 창! 우리가 폰 하면서 많이 보는 화면 ㅎ
- 지금은 spinner 라서 동그랗게 나옴
- dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
< MainActivity.java >
package com.example.a0617_ch06_progressbar_seekbar_ratingbar; import androidx.appcompat.app.AppCompatActivity; import android.app.ProgressDialog; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ProgressBar progressBar = findViewById(R.id.progressBar); progressBar.setProgress(0); progressBar.setSecondaryProgress(50); Button btnStart = findViewById(R.id.btnStart); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 별도의 다이얼로그를 생성하여 ProgressBar 를 사용하려면 ProgressDialog 객체를 활용 ProgressDialog dialog = new ProgressDialog(MainActivity.this); // ProgressBar 스타일 설정 // 1. STYLE_HORIZONTAL : 가로막대 형식으로 표시하며, 진행상황(진척도) 등을 알릴 때 주로 사용 // dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 2. STYLE_SPINNER : 진행 중이라는 상태를 표시하기 유용하며, 중간과정 확인 불가 // dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage("데이터 확인 중"); dialog.show(); } }); } } |
- ProgressBar 완성 코드!
< SeekBar >
< activity_main.xml >
<SeekBar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/seekBar" android:progress="20"/> |
- 추가
- 움직일 수 있는 바 생김
< RatingBar >
<RatingBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ratingBar" android:numStars="5" android:rating="0" android:stepSize="0.5"/> |
- 추가
- 별점 생김
- numStars 별점 수
- rating 기본값 (시작설정값)
- stepSize 몇개씩 증가하는지
< activity_main.xml >
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ProgressBar android:id="@+id/progressBar" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="50" android:secondaryProgress="80" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnStart" android:text="시작" android:textSize="20sp"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnStop" android:text="종료" android:textSize="20sp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:progress="20" /> <TextView android:layout_width="50dp" android:layout_height="wrap_content" android:id="@+id/tvSeekBar" android:text="00" android:textSize="20sp" android:gravity="center"/> </LinearLayout> <RatingBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ratingBar" android:numStars="5" android:rating="1" android:stepSize="0.5"/> </LinearLayout> |
- 최종코드
< MainActivity.java >
SeekBar seekBar = findViewById(R.id.seekBar); final TextView tvSeekBar = findViewById(R.id.tvSeekBar); tvSeekBar.setText(seekBar.getProgress() + ""); // 기본 SeekBar 게이지 값을 TextView 에 표시 RatingBar ratingBar = findViewById(R.id.ratingBar); // SeekBar 의 게이지 조정 시 동작하는 이벤트 처리 => 현재 progress 값 출력 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { tvSeekBar.setText(progress + ""); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); |
- 추가
ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { Toast.makeText(MainActivity.this, "별점 : " + rating, Toast.LENGTH_SHORT).show(); } }); |
- 추가
< MainActivity.java >
package com.example.a0617_ch06_progressbar_seekbar_ratingbar; import androidx.appcompat.app.AppCompatActivity; import android.app.ProgressDialog; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.RatingBar; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ProgressBar progressBar = findViewById(R.id.progressBar); progressBar.setProgress(0); progressBar.setSecondaryProgress(50); Button btnStart = findViewById(R.id.btnStart); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 별도의 다이얼로그를 생성하여 ProgressBar 를 사용하려면 ProgressDialog 객체를 활용 ProgressDialog dialog = new ProgressDialog(MainActivity.this); // ProgressBar 스타일 설정 // 1. STYLE_HORIZONTAL : 가로막대 형식으로 표시하며, 진행상황(진척도) 등을 알릴 때 주로 사용 // dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 2. STYLE_SPINNER : 진행 중이라는 상태를 표시하기 유용하며, 중간과정 확인 불가 // dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage("데이터 확인 중"); dialog.show(); } }); // ------------------------------------------------- SeekBar seekBar = findViewById(R.id.seekBar); final TextView tvSeekBar = findViewById(R.id.tvSeekBar); tvSeekBar.setText(seekBar.getProgress() + ""); // 기본 SeekBar 게이지 값을 TextView 에 표시 RatingBar ratingBar = findViewById(R.id.ratingBar); // SeekBar 의 게이지 조정 시 동작하는 이벤트 처리 => 현재 progress 값 출력 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // SeekBar 게이지(progress 값)가 변경될 때 호출되는 메서드 tvSeekBar.setText(progress + ""); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { Toast.makeText(MainActivity.this, "별점 : " + rating, Toast.LENGTH_SHORT).show(); } }); } } |
- 최종코드
728x90
'Dev.Program > Android' 카테고리의 다른 글
Fragment / 메뉴와 대화상자 / Context_Menu / Toast (0) | 2022.10.10 |
---|---|
ScrollView / SlidingDrawer / ViewFlipper / WebView (0) | 2022.10.10 |
Layout / Chronometer / TimePicker / DatePicker / CalendarView (0) | 2022.10.10 |
CheckBox / RadioButton / Toggle / ImageView (0) | 2022.10.10 |
View / TextView / Button / EditText (0) | 2022.10.10 |