file - setting

 

show line numbers(줄 숫자보임)

show method separators(메소드 끼리 구별할수있는 선 생김)

show shitespaces(띄어쓰기표시)

옵션을 켠다

 

 

android studio plugin

 

api level

json to kotlin class

 

 

반응형
                    disposable = Observable
                            .interval(3000L, TimeUnit.MILLISECONDS)
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(aLong ->{
                                if(viewpager.getCurrentItem() <viewpagerAdapter.size() - 1){
                                    viewpaer.setCurrentItem(viewpager.getCurrentItem() + 1);
                                }else{
                                    viewpager.setCurrentItem(0);
                                }
                            });

onDestroy에서 dispoase()를 잊지말자 

 

 

참고:https://medium.com/mindorks/auto-viewpager-slider-using-rxjava2-fb1da80878bf

반응형

svg쓰는 부분에 

 

ContextCompat.getDrawable(Context,R.drawable.ic_img)//이것을

AppCompatResources.getDrawable(Context,R.drawable.ic_img)//이렇게

 

val drawable = ContextCompat.getDrawable(viewHolder.itemView.context, imgs[position])//이것을

val drawable = AppCompatResources.getDrawable(viewHolder.itemView.context, imgs[position])//이렇게 바꾸자

 

xml에서

android:src

android:button

android:drawableStart 

이렇게 사용하던것을 

 

app:srcCompat

app:buttonCompat

app:drawableStartCompat

요렇게 바꾸자

 

 

 

참고:https://stackoverflow.com/questions/38184911/vectordrawable-not-rendering-correctly-on-api-23

반응형

http://postcode.map.daum.net/guide

 

Daum 우편번호 서비스

우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.

postcode.map.daum.net

홈페이지 들어가면 

기본적으로 이렇게 서버에 띄워서 하라고 하지만 

open() 대신 embed()를 써야 더 원활히 돌아갑니다

(실제 open으로 하다 어느기기는되고 어느기기는안되고 문제발생)

 

http를 android pie 이상에서 사용시에는  안드에서 셋팅을 해줘야한다 (android pie 부터 기본적으로 http 지원 안함)

manifests에서 <application android:cleartextTrafficPermitted="true">를 추가한다 (모든 http 강제허용)

아니면 (구글권장)

<application android:networkSecurityConfig="@xml/network_security_config">

 

<network-security-config>

   <base-config cleartextTrafficPermitted="true">

     <domain-config cleartextTrafficPermitted="true">
      <domain includeSubdomains="true">address.com</domain>
     </domain-config>

   </base-config>

</network-security-config>

 

참고 : https://github.com/daumPostcode/QnA/issues/472

 

 

반응형

 

 

1.android studio file-settings 클릭

 

 

 

2.plugins - wifi adb 검색 후 wifi adb ultimate install 후 재부팅

 

 

 

3.재부팅하면 오른쪽에 탭이하나생김

 

 

5.안드로이드 폰(개발자모드debug모드 활성)연결 후 

본인이 java sdk 설치한 위치의platform-tools

보통 경로는 C:\Users\[컴퓨터명]\AppData\Local\Android\Sdk\platform-tools

ex)C:\Users\android\AppData\Local\Android\Sdk\platform-tools

 

나는 ex)E:\Androidsdk\platform-tools

 

 

cmd 창 열고서 

cd E:\Androidsdk\platform-tools 입력

adb tcpip [원하는포트번호] 입력후 엔터

위에처럼 나오면 성공 

위처럼 안나온다면 

 

adb devices 입력 후

adb -s [device_id] tcpip [원하는포트명] 하면 된다

이제 폰 포트설정 끝

 

 

핸드폰의 wifi 눌러서 연결되어있는 wifi 클릭하면 실제 wifi가 나온다 

ex)192.168.0.242

 

다시 android studio로 돌아가서 

이렇게 넣고 엔터를 치면 

manage devices에 ip번호로 하나 새로 생긴다 연결완료

 

핸드폰이랑 연결을 끊고 run 클릭하면 wifi로 연결된게 있다 

 

주의: 같은환경의 공유기를 쓸때 가능하다 

 

끝 

반응형

일반적으로 memu설치후에 

 

android studio 에서 run 실행하면 아래처럼 뜨는데 이때 미뮤를 재부팅하면 제대로 인식된다

이렇게해도 안됐을때는 

 

 

cmd 창 열고 

 

d드라이브라면 d: 

e드라이브면 e:

로 이동 후 아니면 걍 

 

cd C:\Program Files (x86)\Microvirt\MEmu

입력 후

adb devices 입력 하면 주소값나옴 그걸 복사 후 

 

adb connect 127.0.0.1:[port] 입력

 

aleady connect ~ 뜨면 끝

 

 

 

 

 

반응형
compile 'com.mobsandgeeks:android-saripaar:2.0.3' //build.gradle 추가 

public class Main4Activity extends AppCompatActivity implements Validator.ValidationListener{//리스너달기
@Length(min = 3,max = 5,message = "최소3~최대5")//길이
@NotEmpty(message = "입력해주세용") //필수입력
@Email(message = "이메일형식으로 해주세요") //이메일형식 자동으로 유효성체크해줌
EditText et1;
@NotEmpty(message = "최소3~최대10")
@Password(min = 6,scheme = Password.Scheme.ALPHA_NUMERIC_MIXED_CASE_SYMBOLS,message = "비번은 숫자 영문대문자 특수 문자를 조합하여 입력 ")
EditText et2;
@ConfirmPassword //이메일 확인
EditText et3;
@Length //길이확인
EditText et4;
@Checked(message = "체크를 꼭 하시오")
CheckBox checkBox;

public Validator validator;

Button btn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4);
btn=(Button)findViewById(R.id.btnsend);
et1=(EditText)findViewById(R.id.Et1);
et2=(EditText)findViewById(R.id.Et2);
et3=(EditText)findViewById(R.id.Et3);
et4=(EditText)findViewById(R.id.Et4);
checkBox =(CheckBox)findViewById(R.id.cch);

validator = new Validator(this);//필수
validator.setValidationListener(this);//필수

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
validator.validate();//버튼 클릭시 이벤트 발생 //필수
}
});
}
//유효성 검사 통과하면 호출
@Override
public void onValidationSucceeded() {
Toast.makeText(this,"성공",Toast.LENGTH_SHORT).show();
}
//유효성 검사 오류가 있을때 호출
@Override
public void onValidationFailed(List<ValidationError> errors) {
for(ValidationError error : errors){
View view = error.getView();
String message = error.getCollatedErrorMessage(this);
if(view instanceof EditText){
((EditText)view).setError(message);
}else{
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
}
}
}




버튼을 눌렀을때 이런식으로 checkbox는 토스트로 나오고 나머진 오른쪽 느낌표가 생기며 클릭시 message 표시






참고 :https://github.com/ragunathjawahar/android-saripaar 

반응형

저장한 android 폴더를 다른곳으로 이동했더니 이 에러가 나타났다 


File -settings.. 들어가서 build,Execution,Deployment - Instant Run - Enable Instant Run to has swap code/resource changes on deploy 체크 해제





반응형


EditText

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:lines="1" />//singleline 대신 사용



CheckBox

res/layout/activity.xml

<CheckBox
android:id="@+id/main_checkbox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:button="@drawable/checkbox" //커스텀 원하면 사용
android:checked="false"
android:text="알림설정" />


res/drawable/checkbox

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/r1"/>
<item android:drawable="@drawable/r2"/>
</selector>


java/MainActivity

@BindView(R.id.main_checkbox) CheckBox mainCheckbox;
//변경감지할떄
mainCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Toast.makeText(MainActivity.this, "체크됐당", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "아니당", Toast.LENGTH_SHORT).show();
}
}
});
//체크상태 가져와서 설정
if (mainCheckbox.isChecked()) {
//mainCheckbox.setChecked(true);
}




RadioButton

res/layout/maina_main.xml

<RadioGroup
android:id="@+id/main_radio_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<RadioButton
android:id="@+id/main_radio_man_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="남자" />

<RadioButton
android:id="@+id/main_radio_girl_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="여자" />
</RadioGroup>

res/java/MainActivity.java

@BindView(R.id.main_radio_group) RadioGroup mainRadioGroup;
@BindView(R.id.main_toggle_btn) ToggleButton mainToggleBtn;

//변경감지
mainRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.main_radio_man_btn) {
Toast.makeText(MainActivity.this, "남자선택", Toast.LENGTH_SHORT).show();
} else if (checkedId == R.id.main_radio_girl_btn) {
Toast.makeText(MainActivity.this, "여자선택", Toast.LENGTH_SHORT).show();
}
}
});

int id = mainRadioGroup.getCheckedRadioButtonId();
if (id == R.id.main_radio_girl_btn) {
//mainRadioGroup.check(R.id.main_radio_girl_btn);
}




ToggleButton


res/layout/activity_main.xml

<ToggleButton
android:id="@+id/main_toggle_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:background="@drawable/togglebtn"//이미지설정
android:textOff="No"
android:textOn="yes" />


res/drawable/togglebtn

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/r1"/>
<item android:drawable="@drawable/r2"/>
</selector>


res/java/MainActivity.java

@BindView(R.id.main_toggle_btn) ToggleButton mainToggleBtn;
mainToggleBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mainToggleBtn.isChecked()) {
Toast.makeText(MainActivity.this, "체크됐넴", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "체크됐넴", Toast.LENGTH_SHORT).show();
}
}
});
boolean check = mainToggleBtn.isChecked();





Switch

res/layout/activity_main.xml

<Switch
android:id="@+id/main_switch"
android:text="swich"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="Yes"
android:textOff="No"
android:thumb="@drawable/ic_launcher_foreground"
android:track="@drawable/ic_launcher_background"/>
<!--
thumb = 안에 움직이는 것 모양
track = 감싸고있는 틀
switchMinWidth = 글자와 스위치사이 간격
-->


res/java/MainActivity.java

@BindView(R.id.main_switch) Switch mainSwitch;
mainSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Toast.makeText(MainActivity.this, "체크됐당", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "체크 아니당", Toast.LENGTH_SHORT).show();
}
}
});
boolean check = mainSwitch.isChecked();





ProgressBar

res/layout/activity_main.xml

<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminateOnly="true"
style="?android:attr/progressBarStyleLarge"/>

<ProgressBar
android:id="@+id/main_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="50"
style="?android:attr/progressBarStyleHorizontal"/>

<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateDrawable="@drawable/animationprogress"/>

<ProgressBar
android:layout_width="match_parent"
android:layout_height="30dp"
android:progressDrawable="@drawable/horiprogress"
android:max="100"
android:progress="50"
android:secondaryProgress="70"
style="?android:attr/progressBarStyleHorizontal"/>
<!--
indeterminateOnly = true면 나타나고 false면 사라짐
indeterminate = 무한반복 여부
indeterminateDrawable = progressbar로 보여줄 이미지 설정
indeterminateDuration = 반복될때 반복시간
indeterminateBehavior = 행동방식
-->

res/drawable/animationprogress

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/a1" android:duration="200"/>
<item android:drawable="@drawable/a2" android:duration="200"/>
<item android:drawable="@drawable/a3" android:duration="200"/>
<item android:drawable="@drawable/a4" android:duration="200"/>
<item android:drawable="@drawable/a5" android:duration="200"/>
<item android:drawable="@drawable/a6" android:duration="200"/>
<item android:drawable="@drawable/a7" android:duration="200"/>
</animation-list>


res/drawable/horiprogress

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="30dp" />
<gradient
android:angle="270"
android:centerColor="#c50aff70"
android:centerY="0.75"
android:endColor="#90ff99"
android:startColor="#e5fff6" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="30dp" />
<gradient
android:angle="270"
android:centerColor="#0003ff"
android:centerY="0.75"
android:endColor="#7282ff"
android:startColor="#dce5ff" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="30dp" />
<gradient
android:angle="270"
android:centerColor="#ff005e"
android:centerY="0.75"
android:endColor="#ff8185"
android:startColor="#ffa4a4" />
</shape>
</clip>
</item>
</layer-list>


res/java/MainActivity.java

@BindView(R.id.main_progress) ProgressBar mainProgress;
mainProgress.setMax(10000);
mainProgress.setSecondaryProgress(5000);
mainProgress.setProgress(3000);




circle progress를 치수조절하고 싶을때 

res/layout/activity_main.xml

<ProgressBar
android:id="@+id/main_progress"
android:layout_width="200dp"
android:layout_height="200dp"
android:progressDrawable="@drawable/circular_progress_bar"
android:background="@drawable/circular_progress_bar_bg"
android:indeterminate="false"
android:max="100"
android:progress="50"
style="?android:attr/progressBarStyleHorizontal"/>


res/drawable/circular_progress_bar

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="270"
android:toDegrees="270">//각도
<shape
android:innerRadiusRatio="3"
android:shape="ring"
android:thickness="15sp">
<solid android:color="@color/red" />
</shape>
</rotate>


res/drawable/circular_progress_bar_bg

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadiusRatio="3"
android:shape="ring"
android:thickness="15dp"
android:useLevel="false">
<solid android:color="#CCC" />
</shape>

+애니메이션

res/java/MainActivity.java

@BindView(R.id.main_progress) ProgressBar mainProgress;

ObjectAnimator animator = ObjectAnimator.ofInt(mainProgress,"progress",0,80);
animator.setDuration(2000);//milliseconds
animator.setInterpolator(new DecelerateInterpolator());
animator.start();//mainProgress.clearAnimation();


SeekBar

res/layout/activity_main.xml

<SeekBar
android:id="@+id/main_seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:thumb="@drawable/seekbar"/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="5"
android:progress="3"
style="@style/Widget.AppCompat.SeekBar.Discrete"/>


res/drawable/seekbar

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/r2" android:state_pressed="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/r2" android:state_focused="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/r2" android:state_selected="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/r2"/>
</selector>



res/java/MainActivity.java

@BindView(R.id.main_seek_bar) SeekBar mainSeekBar;
mainSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//사용자가 prgress 변경을 끝냈을때 호출
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//사용자가 thumb를 선택하여 progress변경을 시작할 떄 호출
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//progress가 변경되면 호출.사용자가 직접 ui통해 변경하면 fromUser = true ,code로 변경되면 false
}
});





RatingBar

res/layout/activity_main.xml

<RatingBar
android:id="@+id/main_rating_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:rating="1.5"
android:stepSize="0.1"
android:progressDrawable="@drawable/ratingbar"/>
<!--
android:layout_width="wrap_content" width는 꼭 wrap으로
isIndicator=RatingBar를 사용자가 변경할 수 없게 함
numStars = 화면에 나타나는 별의 개수
rating = 별점의 값
stepSize= 변경의 최소단위(1칸만 해당)
-->


res/drawable/ratingbar

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background" android:drawable="@drawable/ratingbar_empty" />
<item android:id="@android:id/secondaryProgress" android:drawable="@drawable/ratingbar_empty" />
<item android:id="@android:id/progress" android:drawable="@drawable/r2" />
</layer-list>


res/java/MainActivity.java

@BindView(R.id.main_rating_bar) RatingBar mainRatingBar;
mainRatingBar.setRating(1.5f);//값설정
//RatingBar의 값이 변경되면 호출
mainRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
//사용자 UI를 통해 변경한 경우 fromUser true
if (fromUser) {
Toast.makeText(MainActivity.this, "rating" + rating, Toast.LENGTH_SHORT).show();
}
}
});



DatePicker,TimePicker

res/layout/activity_main.xml

<DatePicker
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:calendarViewShown="false"
android:datePickerMode="calendar" />
<DatePicker
android:id="@+id/main_date_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:calendarViewShown="false"
android:datePickerMode="spinner" />
<TimePicker
android:id="@+id/main_time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:timePickerMode="spinner"/>
<!--
절대시간이용해서 시간처리 필수

timestamp = 1970.1.1을 기준으로 지금까지 얼마나 시간이 흘렀는지를 나타내는 시간(GMT,millisecond)(영국 그리니치 천문대 기준)
timeZone = 시간기준선(GMT)와 얼마나 시간이 차이나는지를 나타내는 값(대한민국 서울: +0900)
Local = 사용자의 언어와 국가로 timZone 설정에 사용 (ex:한글(ko),한국(KR))
-->


res/java/MainActivity.java

@BindView(R.id.main_date_picker) DatePicker mainDatePicker;
@BindView(R.id.main_time_picker) TimePicker mainTimePicker;
/*     Data  = java에서 날짜를 나타내는 class
Calendar = java에서 날짜를 이용한 연산을 할때 사용하는 class
SimpleDateFormat : Date String 으로 변경하거나 반대로할때 사용하는 class*/
Calendar c = Calendar.getInstance(Locale.KOREA);
c.set(Calendar.HOUR_OF_DAY,0);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
c.set(Calendar.MILLISECOND,0);
long lastmidnight = c.getTimeInMillis();
c.add(Calendar.DAY_OF_YEAR,1);
long nextmidnight = c.getTimeInMillis();

//String date로 변환
String ds = "2014-11-10T10:25:40.000+0900";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");//-- "timezone" 시 분 초 밀리세컨드
try {
Date d= sdf.parse(ds);
Toast.makeText(this, "시간"+d, Toast.LENGTH_SHORT).show();
} catch (ParseException e) {
e.printStackTrace();
}

//Date String으로 변환
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm",Locale.KOREA);
/*
"yyyy-MM-dd"
"yyyy-MM-dd HH:mm"
"yyyy-MM-dd'T'HH:mmZ"
"yyyy-MM-dd HH:mm:ss.SSSZ"
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
*/
String df =sdf2.format(new Date());


mainDatePicker.init(2017,10,10,new DatePicker.OnDateChangedListener(){

@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Toast.makeText(MainActivity.this, ":"+year+":"+monthOfYear+":"+dayOfMonth, Toast.LENGTH_SHORT).show();
//,,일 가져오기
}
});

mainTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
//,분 가져옴
}
});
//MM dd (E) aa HH:mm   E=요일  aa =오전,오후 

val formatter = SimpleDateFormat(dateFormat, Locale.KOREA) //simpleDateFormat 쓸시 서울을 꼭명시해야 문제없다
formatter.timeZone = TimeZone.getTimeZone("Asia/Seoul")

import android.text.format.DateFormat;

String dayOfTheWeek = (String) DateFormat.format("EEEE", date); // Thursday
String day          = (String) DateFormat.format("dd",   date); // 20
String monthString  = (String) DateFormat.format("MMM",  date); // Jun
String monthNumber  = (String) DateFormat.format("MM",   date); // 06
String year         = (String) DateFormat.format("yyyy", date); // 2013


Calendar.YEAR  현재 년도를 가져온다.

Calendar.MONTH 현재 월을 가져온다. (1월은 0) 

Calendar.DATE  현재 월의 날짜를 가져온다. 

Calendar.WEEK_OF_YEAR 현재 년도의 몇째 주

Calendar.WEEK_OF_MONTH  현재 월의 몇째 주 

Calendar.DAY_OF_YEAR  현재 년도의 날짜 

Calendar.DAY_OF_MONTH  현재 월의 날짜 (DATE와 동일) 

Calendar.DAY_OF_WEEK  현재 요일 (일요일은 1, 토요일은 7)

Calendar.HOUR  현재 시간 (12시간제)

Calendar.HOUR_OF_DAY  현재 시간 (24시간제) 

Calendar.MINUTE  현재 분

Calendar.SECOND  현재 초 



Calendar -> date

Calendar cal = Calendar.getInstance(); 

Date date = cal.getTime(); 


 Date -> Calendar

Date d = new Date ( );

Calendar c = Calendar.getInstance ( );

c.setTime ( d );


calendar -> millisecond

    final Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.HOUR_OF_DAY, 0);

    calendar.set(Calendar.MINUTE, 0);

    calendar.set(Calendar.SECOND, 0);

    calendar.set(Calendar.MILLISECOND, 0);

    calendar.getTimeInMillis();


 millisecond -> calendar 

Calendar calendar = Calendar.getInstance();

calendar.setTimeInMillis(timeStamp);


int mYear = calendar.get(Calendar.YEAR);

int mMonth = calendar.get(Calendar.MONTH);

int mDay = calendar.get(Calendar.DAY_OF_MONTH);


 date -> millisecond 

long milli = date.getTime();


millisecond-> date

long time = System.currentTimeMillis ( );

Date date = new Date ( time );






ImageView

res/layout/activity_main.xml

<ImageView
android:id="@+id/main_image_view"
android:src="@drawable/ic_launcher_background"
android:tint="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!--
scaleType = (view의 크기보다 이미지의 크기가 크거나 작을때 어떻게 처리할 지 설정){
CENTER = 뷰의 중앙에 이미지를 배치하고 확대/축소하지 않음
CENTER_CROP = 이미지를 뷰의 크기와 동일하거나 또는 조금 더 크게 확대/축소함(이미지 가로/세로 비율 유지)(가로세로 비율 키울때 ImageView에 다찼을때 나머지를 자름)
CENTER_INSIDE = 이미지를 뷰의 크기와 동일하거나 또는 조금 더 작게 확대/축소함(이미지 가로/세로 비율 유지)(이미지가 클때 ImageView안으로 들어가게 )(이미지작았을땐해당안됨)
(FIT은 작으면 크게 크면 작게 해줌)
FIT_CENTER = 가운데 배치 후 대상 뷰까지의 확대/축소 비율을 계산하는 속성(Matrix.ScaleToFit.CENTER)을 이용해 이미지를 확대/축소함(자주씀)
FIT_END = 우하단 배치 후 대상 뷰까지의 확대/축소 비율을 계산하는 속성(Matrix.ScaleToFit.END)을 이용해 이미지를 확대/축소함
FIT_START = 좌상단 배치 후 대상 뷰까지의 확대/축소 비율을 계산하는 속성(Matrix.ScaleToFit.START)을 이용해 이미지를 확대/축소함
FIT_XY = 가로와 세로에 대하여 각각 확대/축소 비율을 계산하는 속성(Matrix.ScaleToFit.FILL)을 이용하여 이미지를 확대/축소하므로 뷰의 가로와 세로의 크기를 정확히 맞춤(잘 안씀 이미지깨져서)
MATRIX = 이미지가 그려질 때 Matrix 객체를 이용해 확대/축소함
}

tint,tintMode = 이미지 위에 특정한 색을 입힐때 사용
maxWidth,maxHeight = view의 최대크기 설정
-->


drawable resource file 정보

color = color를 이용해 만든 이미지(ColorDrawable)
<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="#ffff0000"/>



insert = 내부 여백을 갖도록 만든 이미지 (InsetDrawable)
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/r1"
android:insetLeft="10dp"
android:insetRight="10dp"
android:insetTop="10dp"
android:insetBottom="10dp"/>



layer-list = 여러 개의 이미지를 합쳐서 만든 이미지(LayerListDrawable)
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="translucent">
<item
android:id="@+id/drawable1"
android:drawable="@drawable/r1"
/>
<item
android:id="@+id/drawable2"
android:drawable="@drawable/r2"
android:top="30dp"
android:left="30dp"
android:right="30dp"
android:bottom="30dp" />
<item android:drawable="@drawable/a2"
android:top="60dp" android:left="60dp"/>
</layer-list>



transition = 두 이미지 사이에 fade 전환효과를 구현한 이미지(transitionDrawable)
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/r1"/>
<item android:drawable="@drawable/r2"/>
</transition>

ImageButton button = (ImageButton)findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable)button.getDrawable();
drawable.startTransition(500)//0.5초후 변환




selector = 상태에 따라 다른 이미지가 나타나도록 만든 이미지(stateListDrawable)
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/a1"/>
<item android:state_focused="true" android:drawable="@drawable/a1"/>
<item android:drawable="@drawable/a1"/>
</selector>




level-list = Level에 따라 다른 이미지를 보여주는 이미지(LevelListDrawable)
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:minLevel="0" android:maxLevel="2499" android:drawable="@drawable/a1"/>
<item android:minLevel="2500" android:maxLevel="4999" android:drawable="@drawable/a2"/>
<item android:minLevel="5000" android:maxLevel="7499" android:drawable="@drawable/a3"/>
<item android:minLevel="7500" android:maxLevel="10000" android:drawable="@drawable/a4"/>
</level-list>

ImageView.setImageLevel(10);





clip = 이미지를 자르는 이미지(ClipDrawable)
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/r1"
android:clipOrientation="horizontal"
android:gravity="left"/>

ImageView에서 ClipDrawable drawable = iv.getDrawable();로 가져와서 drawable.setLevel(level)cliping 적용.(level0~10000)




rotate= 이미지를 돌린다 (RotateDrawable)
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher_foreground"
android:fromDegrees="45" />//각도 설정 level=0이면(각도의 시작점) (각도는 45도부터 시계반향이 시작점)
android:toDegrees="180"////level10000이면(각도의 끝점)
android:pivotX="50%"
android:pivotY="50%"/>//중심축 설정




scale= 이미지를 확대,축소한다 (ScaleDrawable)
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/r1"
android:scaleWidth="80%"
android:scaleHeight="80%"
android:scaleGravity="center_vertical|center_horizontal"/>




animation-list = 이미지들을 연결하여 애니메이션을 구현한 이미지(animationDrawable)
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">//oneshow=true면 모든게 한번에 보임
<item android:drawable="@drawable/a1" android:duration="50"/>//단위millisecond//1000 =1
<item android:drawable="@drawable/a2" android:duration="50"/>
<item android:drawable="@drawable/a3" android:duration="50"/>
<item android:drawable="@drawable/a4" android:duration="50"/>
<item android:drawable="@drawable/a5" android:duration="50"/>
<item android:drawable="@drawable/a6" android:duration="50"/>
<item android:drawable="@drawable/a7" android:duration="50"/>
</animation-list>




shape = xml로 도형의 모양을 만든 이미지(GradientDrawable)
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
<size
android:width="100dp"
android:height="100dp"
/>
<stroke
android:color="#ff0000ff"
android:width="2dp"
android:dashWidth="5dp" 줄사이즈 설정
android:dashGap="2dp" /> 줄간격 사이즈설정
</shape>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">네모
<size
android:width="100dp"
android:height="100dp"/>
<corners (끝에 코너주기)
android:topLeftRadius="5dp"
android:topRightRadius="5dp"
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"/>
<solid android:color="@color/colorPrimary"/>//안에 채움
<stroke(끝에 줄)
android:width="1dp"
android:color="@color/colorAccent"
android:dashWidth="5dp"
android:dashGap="2dp"/>
</shape>


<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<size
android:width="100dp"
android:height="100dp"/>
<solid
android:color="@color/colorPrimary"/>
<stroke
android:width="2dp"
android:color="@color/colorPrimaryDark"/>
</shape>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="ring" 도넛모양
android:innerRadiusRatio="6"
android:thicknessRatio="10"
android:useLevel="false">//truesetLevel에 따라 채움 가능
<size
android:height="100dp"
android:width="100dp"/>
<solid
android:color="@color/colorPrimary"/>
<stroke
android:width="2dp"
android:color="@color/colorAccent"
android:dashGap="2dp"
android:dashWidth="2dp"/>
</shape>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:type="linear" 점진적으로 바뀜
android:startColor="@color/colorAccent"
android:centerColor="@color/colorPrimary"
android:endColor="@color/colorPrimaryDark"
android:centerX="100%"
android:centerY="100%"
android:angle="90"/>
<gradient
android:type="radial" 원형모양으로 바뀜
android:startColor="@color/colorAccent"
android:centerColor="@color/colorPrimary"
android:endColor="@color/colorPrimaryDark"
android:centerX="50%"
android:centerY="50%"
android:gradientRadius="500"/>
<gradient
android:type="sweep" 시계방향으로 바뀜
android:startColor="@color/colorAccent"
android:centerColor="@color/colorPrimary"
android:endColor="@color/colorPrimaryDark"
android:centerX="50%"
android:centerY="50%" />
</shape>




반응형

'android > study' 카테고리의 다른 글

toolbar  (0) 2022.01.24
layout  (0) 2018.04.08


레이아웃 종류






대략 LinearLayout,RelativeLayout,ConstraintLayout,GridLayout,FrameLayout,ScrollView, 등등이 있다





LinearLayout

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="true"><!--글자 아랫부분 맞춰서 정렬-->
<!--
orientation = 뷰의 추가하는 뱡향을 설정
android:layout_gravity="부모 컨테이너의 여유공간에 뷰가 모두 채워지지 않아 여유공간안에 뷰를 정렬할떄"
(view layout_width layout_height속성을 wrap_content로 할경우 사용됨)
android:gravity="뷰에서 화면에 표시하는 내용물을 정렬할때"
weight = 뷰가 차지하는 공간의 가중치 값을 설정
-->


ReleativeLayout

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--
//기준점(parent)
layout_alignParentTop = 부모 컨테이너의 위쪽과 뷰의 위쪽을 맞춤
layout _alignParentBottom = 부모 컨테이너의 아래쪽과 뷰의 아래쪽을 맞춤
layout_alignParentLeft = 부모 컨테이너의 왼쪽 끝과 뷰의 왼쪽 끝을 맞춤
layout_alignParentRight = 부모 컨테이너의 오른쪽 끝과 뷰의 오른쪽 끝을 맞춤
layout_centerHorizontal = 부모 컨테이너의 수평 방향 중앙에 배치함
layout_centerVerticalVertical = 부모 컨테이너의 수직 방향 중앙에 배치함
layout_centerInParent = 부모 컨테이너의 수평과 수직 방향 중앙에 배치함

//기준점을 기준으로 배치
layout_above = 지정한 뷰의 위쪽에 배치함
layout_below = 지정한 뷰의 아래쪽에 배치함
layout_toLeftOf = 지정한 뷰의 왼쪽에 배치함
layout_toRightOf =지정한 뷰의 오른쪽에 배치함

//정렬
layout_alignTop = 지정한 뷰의 위쪽과 맞춤
layout_alignBottom = 지정한 뷰의 아래쪽과 맞춤
layout_alignLeft = 지정한 뷰의 왼쪽과 맞춤
layout_alignRight = 지정한 뷰의 오른쪽과 맞춤
layout_alignBaseLine = 지정한 뷰의 내용물의 아래쪽 기준선(baseline)을 맞춤
-->

<TextView
android:text="오예"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/parent_center_btn"
android:layout_alignRight="@id/parent_center_btn"/>

<TextView
android:text="오예"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/parent_center_btn"
android:layout_alignLeft="@id/parent_center_btn" />

<TextView
android:text="오예"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/parent_center_btn"
android:layout_alignBottom="@+id/parent_center_btn"/>

<TextView
android:text="오예"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/parent_center_btn"
android:layout_alignTop="@id/parent_center_btn"
android:layout_alignBaseline="@id/parent_center_btn"/>

<Button
android:id="@+id/parent_center_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"/>
</RelativeLayout>





ConstraintLayout

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--나의 00부분을 지정한 id 00부분에 붙이겠다 -->
<Button
android:id="@+id/btn1"
android:text="버튼1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintTop_toBottomOf="parent"/>
<Button
android:id="@+id/btn2"
android:text="버튼2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/btn1"
app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintLeft_toRightOf="parent"/>
<!--나의 top부분을 지정한 id bottom부분에 붙이겠다 -->
<Button
android:text="버튼3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/btn1"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintTop_toBottomOf="parent"
android:layout_marginLeft="20dp" /><!--자식에게만 마진이 먹힌다-->
<Button
android:text="버튼4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintHorizontal_bias="0.3"/><!--30%정도 더 안쪽으로 1 max-->

<Button
android:id="@+id/btn5"
android:text="버튼5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="parent"
android:visibility="gone"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/btn5"
app:layout_constraintBottom_toTopOf="parent"
app:layout_goneMarginLeft="60dp"/><!--부모가 gone(완전사라질때) 이 될때 마진값 주기-->

<android.support.constraint.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline"
app:layout_constraintGuide_percent="0.3"
android:orientation="horizontal"/>
<!--app:layout_constraintGuide_begin or layout_constraintGuide_percent 택해서 사용-->

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/guideline"/>

<!--
layout_constraintLeft_toLeftOf = 나의 left부분을 지정한 id left부분에 붙이겠다
layout_constraintLeft_toRightOf = 나의 left부분을 지정한 id right부분에 붙이겠다
layout_constraintRight_toLeftOf = 나의 right부분을 지정한 id left부분에 붙이겠다
layout_constraintRight_toRightOf = 나의 right부분을 지정한 id right부분에 붙이겠다
layout_constraintTop_toTopOf = 나의 top부분을 지정한 id top부분에 붙이겠다
layout_constraintTop_toBottomOf = 나의 top부분을 지정한 id bottom부분에 붙이겠다
layout_constraintBottom_toTopOf = 나의 bottom부분을 지정한 id top부분에 붙이겠다
layout_constraintBottom_toBottomOf = 나의 bottom부분을 지정한 id bottom부분에 붙이겠다
layout_constraintBaseline_toBaselineOf = 나의 baseline부분을 지정한 id baseline부분에 붙이겠다
baseline=컨텐츠안의 text 아래 끝라인
-->
</android.support.constraint.ConstraintLayout>




나머지는 필요할때 추후 업데이트 


참고:t아카데미





반응형

'android > study' 카테고리의 다른 글

toolbar  (0) 2022.01.24
basicwidget  (0) 2018.04.08

+ Recent posts