TextView / ProgressBar / SeekBar / RatingBar

2022. 10. 10. 15:44Dev.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