2.RatingBar 평가(별점) 하기 테마에 custom하고 manifest에 theme 변경 ==> 실행 안됨... 이거 theme잘못 변경햇나봄
3.ScrollView 스크롤뷰 안에는 뷰(자식태그?)가 하나여야 함! theme 변경(버튼색깔 변경)
4.ViewFlipper https://www.iconfinder.com/search?q=android&price=free 아이콘 다운받아서 res > drawable 에 넣어놔 자동으로 화면 전환하기 위젯 하나씩만 플립핑 됨 처음 기술한 위젯(혹은 레이아웃)이 제일 먼저 화면에 표시됨 자바코드로 플립핑 해야함 오 얘는 뒤로 쌓이네? 플리핑은 받드시 자바코드로 코딩 해줘야 적용이 된다 얘도 바인딩 씀
5.IndicatorLayout 이건 걍 하는 법만 ...
6.TebLayoutViewPager 텝메뉴 구현 그리들에 dependencies 안에 implementation("com.tbuonomo:dotsindicator:4.3") 나 넣어놓기 app:tabGravity="fill" 이러면 텝들이 균등하게 배열됨 프래그먼트: ViewPager2 뷰를 페이징 하는는 페이저 바인딩 넣어놓고 view 패키지 생성 > class layout 에도 xml 파일 3개 생성 뷰에 fragmen BlankFragment .model 패키지도 생성 > MyPagerAdapter클래스 생성 도통모르겠음
public class MainActivity extends AppCompatActivity implements View.OnClickListener, Chronometer.OnChronometerTickListener { //현재 클래스가 이벤트 핸들러가 됨
//테마를 @style/Theme.Material3.Dark.Dialog로 변경
private ActivityMainBinding binding;
private TimePickerDialog timePickerDialog;
private DatePickerDialog datePickerDialog;
private Calendar calendar = Calendar.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
//위젯에 리스너 부착
binding.btnTime.setOnClickListener(this);
binding.btnDate.setOnClickListener(this);
binding.btnElaspedTime.setOnClickListener(this);
binding.btnStart.setOnClickListener(this);
binding.btnStop.setOnClickListener(this);
binding.timerChronometer.setOnChronometerTickListener(this);
//타임피커 타이얼로그 객체 생성
/*
context – the parent context
themeResId – the resource ID of the theme to apply to this dialog
listener – the listener to call when the time is set
hourOfDay – the initial hour
minute – the initial minute
is24HourView – Whether this is a 24 hour view, or AM/PM.
*/
timePickerDialog = new TimePickerDialog(
this,
android.R.style.Theme_Material_Dialog,
(timePicker, hour, minute)->{
binding.textview.setText(String.format("%s시 %s분",hour,minute));
},
calendar.get(Calendar.HOUR),
calendar.get(Calendar.MINUTE),
true
);
/*
context – the parent context
listener – the listener to call when the user sets the date
year – the initially selected year
month – the initially selected month (0-11 for compatibility with Calendar.MONTH)
dayOfMonth – the initially selected day of month (1-31, depending on month)
*/
datePickerDialog = new DatePickerDialog(
this,
(datePicker,year,month,date) ->{
binding.textview.setText(String.format("%s년 %s월 %s일",year,month,date));
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH)+1,
calendar.get(Calendar.DATE)
);
}////////////////////////onCreate
//요 밑에서 이벤트 구현
//버든의 클릭 이벤트 용
@Override
public void onClick(View view) {
if(view.getId()== R.id.btnTime){
if(!timePickerDialog.isShowing()) timePickerDialog.show();
}
else if(view.getId()==R.id.btnDate){
if(!datePickerDialog.isShowing()) datePickerDialog.show();
}
else if(view.getId()==R.id.btnElaspedTime){
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Toast.makeText(this, dateFormat.format(new Date(SystemClock.elapsedRealtime())), Toast.LENGTH_SHORT).show();
}
else if(view.getId()==R.id.btnStart){
//현재시간을 크로노미터의 기준 시간으로 설정
binding.timerChronometer.setBase(SystemClock.elapsedRealtime());
binding.timerChronometer.start();
}
else{
binding.timerChronometer.stop();
}
}
//크로노미터 틱 이벤트 용
/*
크로노미터는 디폴트로 분초로 표시됨
아래코드 추가 시 시,분,초로 표시가능
*/
//초가 변할때마다 자동으로 호출되는 콜백 메소드
@Override
public void onChronometerTick(Chronometer chronometer) {
//크로미터를 시작한이후 플러온 시간
long elapsedTime =SystemClock.elapsedRealtime()-binding.timerChronometer.getBase();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
binding.timerChronometer.setText(dateFormat.format(new Date(elapsedTime)));
}
}
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="10dp"
android:background="@drawable/layout_rounded"
>
<ImageView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="50dp"
android:src="@drawable/icon2"
android:scaleType="fitXY"
/>
<TextView
android:layout_width="0dp"
android:layout_weight="8"
android:layout_height="50dp"
android:id="@+id/textView"
android:gravity="center"
android:textColor="@color/white"
android:textSize="18sp"
android:maxLines="1"
android:ellipsize="end"
/>
<!--
... 표시하기
android:singleLine="true" dprecated됨
android:maxLines="1" :한 줄만 표시
ellipsize:Text가 TextView를 넘어갔을 때 표시할 방법을 설정
ellipsize = "end" - 뒷 부분을 ...으로 표시
아래는 maxLines와 함께쓰면 빨간줄 :tools:ignore="EllipsizeMaxLines" 추가 시 제거됨
ellipsize = "none" - ... 없이 뒷 부분 잘라서 표시 (기본)
ellipsize = "start" - 앞 부분을 ...으로 표시
ellipsize = "middle" - 중간 부분을 ...으로 표시
ellipsize = "marquee" - 흐르는 텍스트 효과
아래 세줄과 자바코드에서 textView.setSelected(true)추가하면 marquee가 적용 됨
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
-->
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//위젯열기
TextView textView = findViewById(R.id.codeTextview);
ImageView imageView = findViewById(R.id.codeImageview);
Button button=findViewById(R.id.codeButton);
//values폴더의 string.xml과 drawable폴더에 있는 이미지 접근 시
//getStrig()이나 getDrawable()로 직접 접근 가능! -Resources객체 불필요!!
//왜냐면 앱에서 가장 많이 사용하는 리소스이기 때문에 편하게 쓰라고 제공 해 주나 봄
Log.i("com.kosmo.resource",String.format("문자열 데이터:%s",getString(R.string.codeMessage)));
//1.res폴더에 정의된 모든 리소스를
// 얻어올 수 있는 클래스 : Resources -getResources(); 메소드로 얻는다
Resources resources= getResources();
//텍스트뷰의 text속성 설정
textView.setText(R.string.codeMessage);
//textView.setText(getString(R.string.codeMessage));
//textView.setTextSize(20);//기본 단위가 SP
//textView.setTextSize(TypedValue.COMPLEX_UNIT_SP,20);//위와 동일
//textView.setTextSize(TypedValue.COMPLEX_UNIT_SP,resources.getDimension(R.dimen.xmlDimen));
/*
GETdIMENSION()이 문제여//// 이 메소드가 pixel형태로 리턴
※ getDimension() 메소드가 pixel 형태로 리턴한다
dimens.xml에 sp라고 명시시
getDimension () 은 알아서 pixel로 변환해서 리턴
dimens.xml에서 sp로 설정한 값을 자바코드로 적용시 아래 코드로 읽어와야
크기가 똑같이 적용됨 즉 숫자로 직접 지정했을때와 같다
*/
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,resources.getDimension(R.dimen.xmlDimen));
// textView.setTextColor(resources.getColor(R.color.xmlColor));
textView.setTextColor(ContextCompat.getColor(this,R.color.xmlColor));
//이미지뷰의 src속성 설정
//방법1. imageView객체.setImageResource(int 리소스아이디)
//imageView.setImageResource(R.drawable.picture_emergency);
//방법2.ImageView객체.setImageDrawable(Drawable)
//imageView.setImageDrawable(getDrawable(R.drawable.picture_emergency));
//방법3 ImageView객체.setImageBitmap(Bitmap)
//Bitmap bitmap=((BitmapDrawable)getDrawable(R.drawable.picture_emergency)).getBitmap();
//BitmapFactory.decodeResource(Resources객체,리소스 아이디)
Bitmap bitmap=BitmapFactory.decodeResource(resources,R.drawable.picture_emergency);
imageView.setImageBitmap(bitmap);
button.setOnClickListener(v ->{
int[] ages=resources.getIntArray(R.array.ages); //int-array 는 없음
String[] mountains=resources.getStringArray(R.array.mountains);
Log.i("com.kosmo.resource","나이대:"+ Arrays.toString(ages));
Log.i("com.kosmo.resource","산:"+ Arrays.toString(mountains));
});
}
setTheme(R.style.Theme_MyThemeChild); //자바코드가 우선이라서 다 무시되고 이게 적용 됨 !
[STYLE]
스타일 - 특정 위젯/뷰
스타일 적용 순위 위젯의 스타일 > 앱의 테마 즉 android:textColor를 위젯과 앱의 테마에 동시 지정 시 젯에 지정한 스타일이 우선한다
[ 안드로이드에서 제공하는 스타일을 위젯에 적용]
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="텍스트 스타일(색상 및 크기 등 미지정)"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
style="@style/TextAppearance.AppCompat.Headline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="34dp"
android:text="안드로이드 제공 스타일:스타일 적용"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.703"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
[내가 만든 스타일을 위젯에 적용]
테마가 MaterialComponents일때 버튼은 백그라운드가 적용이 안된다. 즉MaterialComponents테마는 button자체적으로 별도의 background가 적용되어 있어서 바꿀 수 없다 아래 두 가지 설정으로 배경색을 설정 할 수 있있다 backgroundTint로 색상 설정 backgroundTintMode로 add 설정
-columnCount :열 개수 -orientation:그리드를 수평방향으로 먼저 채울지 , 수직방향으로 먼저 채울지 지정
ex. 수평이면 1 2 3 4 5 6 수직이면 1 3 5 2 4 6
행 병합 할 때 요놈들 gravity랑 쌍으로 써야 제대로 병합됨!! -layoput_rowSpan : 행을 지정된 개수 만큼 병합 -layout_columnSApan : 열을 지정된 개수 만큼 병합. -layout_gravity: 병합 할 때 요놈을 꼭 같이 사용하자!!!