-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathandroid java.txt
More file actions
536 lines (399 loc) · 21.6 KB
/
android java.txt
File metadata and controls
536 lines (399 loc) · 21.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
java 로직을 짜는것 (동작)
해당 xml 동작 Class의 Object를 생성하고 시작해야함.
- Button , TextView, EditText, Toast, ImageView..........
- 문자열 사용시 앞뒤 공백이 문제될수 있음 그럴때 trim()를 많이 사용함
- xml과 연결할떄 findViewById(R.id.idname)
- variable로 관리
- parameter 값을 클레스로도 할수있다.
- startActivity()
두번쨰 엑티비티가 실행된다는것은 처음 화면 위로 두번쨰 엑티비가 시작된다는 의미
그래서 두번쨰 엑티비에 finish() 를 써도 처음화면은 남아 있는것
- 처음 데이터 전달시 trim() 꼭하기
ImageView Class
- image 를 int로 가져온 이유는 ?? android 에서 자동으로 우리가 넣은 image 를, 정수로 바꿔서 관리하기떄문
- array과 같이 관리하면 좋음
Intent Class
- Activity 를 연결하는 Class
- Method : putExtra(key,value) , getTypeExtar(key) , startActivityForResult(intent,requestCode int), setResult(RESULT_OK,intent)
-보내는쪽
Intent Object생성후 intent variable.putExtra("key",data)
-받는쪽
String guess = getIntent().getStringExtra("key"); (defaultValue있는것도 있음 있는것은 설정해줘야함)
- 3개 이상의 Activity가있다면 데이터를 화면이동하는 순서대로 데이터를 보내고 받아야함
지나가는 Activity마다 데이터를 받고 보내고 해야함
startActivityForResult(intent,requestCode int) 데이터 전달하고 다시 받는 법
주요Method = setResult(RESULT_OK,intent);
데이버를 보내고
startActivityForResult(intent, requestCode: 0)
requestCode 는 0 말고도 됨 여러개Activity 를 연결해 쓸수가 있기때문에 숫자에 따라 연결이 됨
밑의 onActivityResult 에서 if문을 쓰는 이유
받고
getIntent().getTypeExtar()
다시 보내고
intent.putExtra("key",data);
setResult(RESULT_OK,intent);
다시 받는곳 onCreate와 동일선상
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 0 && resultCode == RESULT_OK){
Type variable= data.getStringExtra("key");
}
}
Serializable
- Class Object를 전달하는 방법 Serializable 중요
- 클레스 명 옆에 implements Serializable(데이터를 일렬로 byte단위로 늘려라)
보내는 방법은 다른 인텐트와 동일 putExtra()
받을떄
Class variable = (Class) getIntent().getSerializableExtra("Class");
캐스팅하는 이유는 데이터를 일렬로 바이트화 시켰기떄문에 다시 원상 복구를 해줘야함
내부의 앱과 연결할때 쓰는 Template(앱이 연결을 받아줘야 사용가능) 따로 이해후 삭제
-연락처 선택
public void selectContact(){
Intent i = new Intent(Intent.ACTION_PICK);
i.setType(ContactsContract.Contacts.CONTENT_TYPE);
if( i.resolveActivity(getPackageManager()) != null) {
startActivityForResult(i, 1);
}
}
-문자 manifest설정 필요
public void composeMmsMessage(String message, Uri attachment){
Intent i = new Intent(Intent.ACTION_SEND);
i.setData(Uri.parse("smsto:012-3455-4455"));
i.putExtra("sms_body", message);
i.putExtra(Intent.EXTRA_STREAM, attachment);
if(i.resolveActivity(getPackageManager()) != null){
startActivity(i);
}
}
manifest 설정 문자 설정시
<action android:name="android.intent.action.SEND"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
-웹연결
public void openWebPage(String url){
Uri webpage = Uri.parse(url);
Intent i = new Intent(Intent.ACTION_VIEW, webpage);
if(i.resolveActivity(getPackageManager()) != null){
startActivity(i);
}
}
- 원하는 시간:분 에 알람 메세지 나오도록 하는 코드
public void createAlarm(String message, int hour, int minutes){
Intent i = new Intent(AlarmClock.ACTION_SET_ALARM)
.putExtra(AlarmClock.EXTRA_MESSAGE, message)
.putExtra(AlarmClock.EXTRA_HOUR, hour)
.putExtra(AlarmClock.EXTRA_MINUTES, minutes);
if(i.resolveActivity(getPackageManager()) != null){
startActivity(i);
}
}
- 이메일 앱 실행시키기 manifest 추가
public void composeEmail(String[] addresses, String subject){
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL, addresses);
i.putExtra(Intent.EXTRA_SUBJECT, subject);
if(i.resolveActivity(getPackageManager()) != null){
startActivity(i);
}
}
manifest 설정
<action android:name="android.intent.action.SENDTO"/>
<data android:scheme="mailto"/>
MidiaPlayer Class .create()
- Midia Framework가 하나밖에 없기때문에 this, 를 표시해야함 . start();
- mp = MediaPlayer.create(Activity.this,R.raw.dice_sound);
- res에 raw에 음악이나 영상 관련 파일을 저장시킴
Log 로 확인
- Log.i("tag","msg") Logcat에서 확인
Log - i (Information 의 약자) d는 Debugging e 는 Error
- 에러확인 할떄 로그를 찍어보면서 하는걸 습관화 해야할듯
Toast Class
- show()입력해야 화면에 보여짐
- 그래비티로 위치 조정 가능
Snackbar (Toast와 비슷 단 view값이 있어야 생성함)
method
make(view, "text", Snackbar.나오는 시간)
setAction(text,listener)
show()
AlertDialog.Builder alert
- AlertDialog 는 Builder와 항상 같이 사용해야함 생성할때도 생성자에 연결하는 곳 명시
- Mehtod
setTitle,setMessage,setPositiveButton, setNegativeButton, setNeutralButton
setCancelable, show(), setView(),
- setPositiveButton
(String, new DialogInterface.OnClickListener()
- AlertDialog show() 필수 적으로 적어야함
- Custom
xml에서 하나의 layout을 만들고 자바에서 alert.setView()에 View 의 variable 에 저장해서 사용
경로를 연결할때 viewVariable.find해야함
AlertDialog dialog
dialog = alert.create(); Custom으로 만들땐 create와 cancel().... 때문에 AlertDialog.Builder 에서 AlertDialog로 변환
dialog.show();
dialog.cancel()
- Method
setTitle(),setMessage(),setPositiveButton("", new D),setNegativeButton("", new D),setNeutralButton("",new D)
show(), return, setCancelable() 은 버튼 들 다 적고 써야함
AlertDialog 창유지
- 다이얼 로그의 버튼을 눌렀을때 다이얼로그가 유지가 될려면 다이얼로그의 창의 디자인만 셋팅후
동작세팅은은 OnShowListener에서 처리한다.
Ex)
alertDialogVar.setOnShowListener(new DialogInterface.OnShowListener(){
Button b = alertDialogVariable.getButton(AlertDialog.BUTTON_POSITIVE); // positive버튼과 연결
b.setOnClickListener(new View.OnClickListener(){
// todo
}
Method
isShowing() 창유지 단 setOnShowListener 안에서만 사용 가능
...Layout.LayoutParams
- ....Layout.LayoutParams 는 레이아웃 안의 attribute 의 크기를 설정하는 클레스
다른 Layout 도같이 됨
ex) layout.addView(createImg,layoutParams.width = 150,layoutParams.height =230);
TextWatcher()
editTxtId.addTextChangedListener(new TextWatcher() 텍스트가 바뀔때마다 이벤트를 감지
3가지 오버라이드 함수
beforeTextChanged 바뀌기전
onTextChanged 바뀌는중
afterTextChanged 바뀐후
라이프 싸이클 --------------------- 중요 실행순서를 확실히 기억하고 외워야 될듯
-CallBacks
유저가 어떤 액션을 취할때 실행되는 function를 콜백함수라고함.
(onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy() )
Ex) |------------------|
간단하게 onCreate -> onStart -> onResume ->화면->onPause ->onStop -> ondestroy
|---------------------------------------------|
- onPause() : Acitity 위에 다른 Activity가 올라오거나 하여 focus 를 잃었을때 불린다.
- onResume() : focus를 다시 얻었을때 불린다.
-onStop() : Activity가 완전히 화면을 벗어날때 불린다
홈키를 눌러 화면으로 이동하거나 전화가 와서 화면을 완전히 덮는 경우 불린다.
-onDestroy()
finish() or 디스플레이가 회전 될때 호출 된다
-onSaveInstanceState()
onSaveInstanceState를 쓰는 이유는 onCreate 에 저장할수 있기때문 (Bundle 에 저장 하기때문 onCreate의 parameter)
outState.putValueType( value) --- put임 get이 아니라 주의
CountDownTimer Class
1초 = 1000 시간 *3600 분 * 60
CountDownTimer countDownTimer;
countDownTimer = new CountDownTimer(원하는 시간,interval)
끝에는 start();
RecyclerViewAdapter & RecyclerView 좀더 정리가 되야함
- 개념
"리사이클러뷰(RecyclerView)"는 다른 "리스트 표시를 위한 요소"들이 그러하듯, 데이터 목록을 아이템 단위의 뷰로
구성하여 화면에 표시하기 위해 "어댑터(Adapter)"를 사용합니다.
그런데 화면에 표시될 아이템 뷰들을 수직(Vertical) 방향으로,
일렬로 나열하는 리스트뷰와 달리, 리사이클러뷰는 수평(Horizontal) 방향 레이아웃 또는 격자(Grid) 형태의
레이아웃으로도 나타낼 수 있습니다. (물론, 이보다 더 다양하고 복잡한 형태의 레이아웃으로
직접 커스터마이징할 수도 있습니다.) 이를 위해 리사이클러뷰에서는 아이템 뷰가 나열되는
형태를 관리하기 위한 요소를 제공하는데, 이를 "레이아웃매니저(Layout Manager)"라고 부릅니다.
Tip) 상속 받은 걸 보고 Activity,Adapter.... 구분 가능
엑티비티 속의 또다른 엑티비티와 비슷 실제 엑티비티는 아님
- Context 와 ArrayList<model>을 변수 생성
- Constructor parameter 를 Context 와 ArrayList<Model>을 설정
0. class ViewHoler 를 생성
-ViewHolder 는 화면에 표시될 아이템 뷰를 저장하는 Object 입니다
inheritance 는 RecyclerView.ViewHolder
ViewHoler에 recyclerView 의 cell 의 각각의 사용할 tag의 아이디값을 연결하고 동작코드를 적는곳
1.onCreateViewHolder : View 생성후 ViewHolder에 view를 담아서 Return
- LayoutInflater은 XML에 미리 정의해둔 틀을 실제 메모리에 올려주는 역할을 한다.
즉, LayoutInflater는 XML에 정의된 Resource를 View Object로 반환해주는 역할을 한다.
우리가 매번 사용하는 onCreate() 메서드에 있는 setContentView(R.layout.activity_main) 또한 Inflater 역할을 한다
2. onBindViewHolder: 리스트에 있는 데이터를 화면에 있는 뷰(텍스트뷰, 이미지뷰....)에 표시하는 메소드
Tip) parameter position 은 해당 뷰의 인덱스값
- 해당 position의 indexValue 로 ArrayList에 저장되어있는 Value 을 Model Class로 저장후
parameter 값인 holder를 이용해 setText를 한다.
3. getItemCount : 리스트에 있는 데이터의 갯수를 리턴하는 함수
ArrayList<Mobel> .size();
TiP) Adapter 모든 Method 를 제대로 return해줘야 recyclerView.setadapter() 각 정상 작동을 함.
RecyclerView 정리가 더필요함
-setLayoutManager
리니어(LinearLayoutManager) : 수평(Horizontal) 또는 수직(Vertical) 방향, 일렬(Linear)로 아이템 뷰 배치.
그리드(GridLayoutManager) : 바둑판 모양의 격자(Grid) 형태로 아이템 뷰 배치.
스태거드그리드(StaggeredGridLayoutManager) : 엇갈림(Staggered) 격자(Grid) 형태로 아이템 뷰 배치
- RecyclerView 워크플로우
MainActivity 에 RecyclerView 추가 -> itemView Layout 추가 (R.layout.item.xml)
-> RetcyclerViewAdapter 구현 -> 어뎁터, 레이아웃 지정(setAdapter(),setLayoutManager())
LinearLayoutManager(this,HORIZONTAL,boolean) boolean 은 reverseLayout 값임
GridLayoutManager gridLayoutManager = new GridLayoutManager(MainActivity.this,2);
parameter int 는 행을 몇개를 표시할지 설정
GridLayoutManage 줄마다 커스텀 하는 코드
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int gridPosition = position % 5;
switch (gridPosition) {
case 0:
case 1:
case 2:
return 2;
case 3:
case 4:
return 3;
}
return 0;
}
});
List Paging RecyclerView
Method recyclerView.addOnScrollListener()
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
int totalCount = recyclerView.getAdapter().getItemCount();
lastPosition = lastPosition +1; // 인덱스값이라 -1 인듯... ?
if(lastPosition == totalCount){
//아이템 추가 ! 입맛에 맞게 설정하시면됩니다.
}
}
});
Activity에서 Menu 사용법
onCreateOptionsMenu(){ }
엑티비티에 대한 옵션 메뉴를 지정하기위한 곳
함수는 추가 한 옵션 메뉴(Option Menu)를 클릭할 때마다 호출이 됩니다.
메뉴를 클릭하였을 때 따로 처리해야 할 내용이 있다면 이 함수안에 구현하면 됩니다.
onOptionsItemSelected( ){ }
함수는 옵션 메뉴(Option Menu)에서 특정 Menu Item을 선택하였을 때 호출되는 함수입니다.
매개변수로 선택 된 MenuItem의 객체가 넘어옵니다.
메뉴 항목을 성공적으로 처리하면 true를 반환합니다. 메뉴 항목을 처리하지 않는 경우,
onOptionsItemSelected()의 슈퍼클래스 구현을 호출해야 합니다(기본 구현은 false를 반환합니다).
onOptionsMenuClosed()
함수는 옵션 메뉴(Option Menu)를 클릭하여 활성화 된 상태에서 이전 버튼을 클릭하거나
액티비티의 다른 영역을 클릭하여 옵션 메뉴를 닫을 때 호출되는 함수입니다.
Appbar 추후 다시 공부해야할듯 정확한 작동을 이해못한듯.
-표시하기
manifest - application안에 android:theme="@style/AppTheme"
- label : AppBar 제목
styles.xml
AppBar 가 포함된 테마
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
AppBar 사용하지 않는 테마
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
- AppBar엑세스
액티비티에서 ActionBar ab = getSupportActionBar() ;
- AppBar Color resources colors.xml에서 변경
textColorPrimary : TitleTextColor
colorPrimary : AppBarBackground
colorPrimaryDark : 스마트폰의 상태 표시 영영
- AppBar에 Action 추가하기
menu resources package menu에 xml파일에서 item으로 설정
Activity 연결과 세팅
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- 왼쪽에 icon설정하는 법
getSupportActionBar().setDisplayHomeAsUpEnabled(true); appbar (뒤로가기 아이콘)
android.R.id.home 아이디는 이미 설정되어 잇음
Radio
항상 라디오 그룹안에서 버튼을 생성해야함
radioGroup.getCheckedRadioButtonId(); 이벤트 발생시 체크되어있는 아이디를 가져옴 int로 되어있음
선택 안했을시 3가지
1. checkedId null 활용
앱을 시작할때 둘중하나는 세팅해놓는방법
2.디폴트 값을 주자 라디오 버튼 연결한후 setChecked();
3.xml에 Attribute checked 설정
program 종료 3가지
- 엑티비티 완전 종료
ActivityCompat.finishAffinity(클레스명.this)
- 앱 완전 종료
ActivityCompat.finishAffinity(클레스명.this); // 엑티비티 종료
System.exit(0); // 프로세스를 종료
- 아니면 화면 넘어갈때마다 finish()을 작성하는 방법
CheckBox 자동 로그인 Template
if(checkAutoLogin.isChecked()){
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("auto_login",true);
editor.apply();
}
onCreate 와 같은 영역에
boolean autoLogin = sp.getBoolean("auto_login",false);
// 2. 자동로그인이 True 로 되어있으면, 이메일과 비밀번호를 에디트 텍스트에 표시
if(autoLogin == true){
emailEdit.setText(email);
pswEdit.setText(password);
checkAutoLogin.setChecked(true);
}
AsyncTask (android에서 제공해주는 Thread Class) Deprecated 된다는 말이있음 새로운 대체 클레스를 찾아봐야 할듯
class 생성시 AsyncTask<> 를 Inheritance
exteds AsyncTask<doInBakcground의 String... , onProgressUpdate의 Void.. ,
doInBackground의 return value >
memberVariables
Context
Constructor
parameter Context
Override
onPreExecute()
doInBackground() 실행하기 전에 , 해야할 일을 작성하는곳
doInBackground(Seting... strings)
Implement method 꼭 생성해야함
오래걸리는 일이나, 동시 작업이 필요한 일은 이 함수 안에 작성
String... strings : 복수의 문자열 받아줌 받아준 문자열을 배열로 받아줌 정해지지 않은 배열을 받을떄 사용 함
onPostExecute()
doInBackground() 실행후 해야할 일을 작성하는곳
onProgressUpdate(Viod...)
Method
exexute(); 실행
Tip) ProgressBar.... 을 사용할때 Constructor 에 연결 시켜야 편함
Bitmap (image 처리관련 Class)
URL
InputStream
Tip) Url 끝에 png jpg는 다운받을수 있다
ProgressBar를 사용할떄 실무에서 RelativeLayout 를 사용 많이함 (겹쳐서 표시하고 싶을떄)
Get_location
Manifest
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
에뮬레이터 gps 세팅 ...
LocationManager 정립이 필요함
LocationListener 정립이 필요함
1
locationManager = (LocationManager) MainActivity.this.getSystemService(LOCATION_SERVICE);
locationListener = new LocationListener()
2
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
5000, // 밀리세컨드, 1000 = 1초
10, // 미터 1 = 1m
locationListener);
// alt enter 두번 펄스 파인 권한 설정 이 생성됨
3
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// 유저한테 , 이 앱은 위치기반 권한이 있어야 한다고 알려야 한다.
// 유저가 권한 설정을 하고 나면, 처리해야 할 코드를 작성하기 위해서
// requestCode 값을 설정한다.
//3
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},
0);
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
4
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 0){
if (ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},
0);
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
5000, // 밀리세컨드, 1000 = 1초
10, // 미터 1 = 1m
locationListener);
}
}
reCreate() 다시시작
notifyDataSetChanged(); 현재 페이지에를 유지하면 서 추가할수있다.
onBanckPressed() 뒤로가기버튼의 Method
String... variable : 복수의 문자열 받아줌 받아준 문자열을 배열로 받아줌 정해지지 않은 배열을 받을떄 사용 함