2017 JAVA 교육수료
- 61DAY / jQuery 메서드 2017.06.30
- 53DAY / 안드로이드 앱 만들기 2017.06.20
- 50DAY / Android / 버튼 클릭 이벤트 처리, 터치이벤트 처리 2017.06.15
- 49DAY / Android Studio / 설치, 프로젝트생성, 아이콘바꾸기 2017.06.14
61DAY / jQuery 메서드
선택기 메서드
children : 선택된 대상의 1단계 자식검색
find : 선택된 대상의 자식 전체 검색
parent : 선택된 대상의 1단계 부모검색
parents : 선택된 대상의 html최상위까지 검색(매개변수로 인하여 브레이크 가능) 최상위:html
first : 선택된 대상의 첫번째를 선택
last : 선택된 대상의 마지막을 선택
eq : 선택된 대상의 해당 index를 선택
index : 선택된 대상의 index값을 구한다. ex) $('선택자').index($(this));
html제어메서드
wrap : 선택된 대상에 부모를 생성한다
append : 선택된 대상의 자식요소 마지막에 html을 생성한다.
prepend : 선택된 대상의 자식요소 첫번째에 html을 생성한다.
html : 선택된 대상의 내부의 html을 생성한다.
next : 선택된 대상의 다음순서에 html을 삽입한다.
prev : 선택된 대상의 이전순서에 html을 삽입한다.
비교메서드
prop : 선택대상의 속성의 상태를 비교하여 boolean으로 리턴해준다. 혹은 실행
ex) 상태정보 - var isCheck = $('선택자').prop('checked');
상태실행 : $('선택자').prop('checked', true or false);
$('선택자').prop('readonly', true);-- true일때 readonly
is : 선택대상의 속성 및 존재여부를 확인하여 boolean으로 리턴해준다.
ex) 상태정보 : var isCheck =$('선택자').prop(':checked');
상태정보 : var isCheck = $('선택자').prop('클래스 혹은 아이디');
$('article').parent().find('h1:eq(0)').remove();
article의 부모의 1단계아래자식중 h1의 첫번째
var btn1 =$('<button></button>');
btn1.attr('type','button');
btn1.addClass('add');
btn1.text('추가');
var btn2 =$('<button></button>');
btn2.attr('type','button');
btn2.addClass('del');
btn2.text('삭제');
$(document).on('click','.add',function(){
var clone = $(this).parents('article').clone();
clone.find('h1').text('냠냠');
$('article').parent().prepend(clone);
});----만든객체도 추가됨
$('.add').click(function(){
var clone =$(this).parents('article').clone();
clone.find('h1').text('한국스마트정보교육원');
$('article').parent().prepend(clone);
}); ===얜 안됨
$(document).on('click','.indexCheck',function(){
var parentObj = $(this).parents('article');
var ptext = parentObj.find('p').text();
alert(ptext);
});
53DAY / 안드로이드 앱 만들기
공공api를 이용한 미세먼지 확인 앱 만들기
(1)공공api를 얻기위해 권한을 신청한다. 저번에 신청한 api를 사용하겠다
(2)새 프로젝트를 생성한다. 버전은 android4.4(kikat)으로 생성하였다
(3)AndroidManifest.xml파일에 permission을 추가한다
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
(4)Air라는 자바파일안에
DataTime, 시도명을 Setter and Getter , To String 해준다.
(5)AirService.java 생성
package com.example.airapp.airapp;
import android.util.Log;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class Airservice {
public static Air getAir() {
//새로운 객체를 불러온다.
Air air = new Air();
String str = getAirList();
try {
//XML파싱
//(1)factory 생성한다.
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//(2)factory에서 pullparser를 생성한다.
XmlPullParser parse = factory.newPullParser();
//(3)parser에서 사용할 데이터를 입력한다. StringReader타입으로 데이터를 전달해줘야 하기 때문에 getAirList라는 메서드를 생성하였다.
parse.setInput(new StringReader(str));
//(4)현재 팟의 이벤트 타입을 받는다.
int type = parse.getEventType();
boolean flag = false; //값이 참일때만 수행하기위해 생성
String local = "";
//(5)LOOP구문 : parser의 마지막 </tag>가 될때까지
while(type != XmlPullParser.END_DOCUMENT){
//(6)<tag>text</tag>이므로 startTag뒤에있는 Text를 찾기위한 switch절이다.
switch(type){
case XmlPullParser.START_TAG: //(6)-1.start Tag가 다음 중 하나일 때 flag값이 true가 된다.
local = parse.getName();
if(local.equals("dataTime")
||local.equals("seoul")
|| local.equals("busan")
|| local.equals("daegu")
|| local.equals("incheon")
|| local.equals("gwangju")
|| local.equals("daejeon")
|| local.equals("ulsan")
|| local.equals("gyeonggi")
|| local.equals("gangwon")
|| local.equals("chungbuk")
|| local.equals("chungnam")
|| local.equals("jeonbuk")
|| local.equals("jeonnam")
|| local.equals("gyeongbuk")
|| local.equals("gyeongnam")
|| local.equals("jeju")
|| local.equals("sejong")){
flag = true;
}
break;
case XmlPullParser.TEXT: //(6)-2.위의 case조건에 맞았다면 flag값은 true이므로 if문이 실행된다.
if(flag) {
if(local.equals("dataTime")) { //(6)-3.조건에 맞는 TEXT값을 int형으로 바꾸어 세팅한다. flag값은 false가된다
air.setDataTime(parse.getText());
}else if(local.equals("seoul")) {
air.setSeoul(Integer.parseInt(parse.getText()));
} else if(local.equals("busan")){
air.setBusan(Integer.parseInt(parse.getText()));
} else if(local.equals("daegu")){
air.setDaegu(Integer.parseInt(parse.getText()));
} else if(local.equals("incheon")){
air.setIncheon(Integer.parseInt(parse.getText()));
} else if(local.equals("gwangju")){
air.setGwangju(Integer.parseInt(parse.getText()));
} else if(local.equals("daejeon")){
air.setDaejeon(Integer.parseInt(parse.getText()));
} else if(local.equals("ulsan")){
air.setUlsan(Integer.parseInt(parse.getText()));
} else if(local.equals("gyeonggi")){
air.setGyeonggi(Integer.parseInt(parse.getText()));
} else if(local.equals("gangwon")){
air.setGangwon(Integer.parseInt(parse.getText()));
} else if(local.equals("chungbuk")){
air.setChungbuk(Integer.parseInt(parse.getText()));
} else if(local.equals("chungnam")){
air.setChungnam(Integer.parseInt(parse.getText()));
} else if(local.equals("jeonbuk")){
air.setJeonbuk(Integer.parseInt(parse.getText()));
} else if(local.equals("jeonnam")){
air.setJeonnam(Integer.parseInt(parse.getText()));
} else if(local.equals("gyeongbuk")){
air.setGyeongbuk(Integer.parseInt(parse.getText()));
} else if(local.equals("gyeongnam")){
air.setGyeongnam(Integer.parseInt(parse.getText()));
} else if(local.equals("jeju")){
air.setJeju(Integer.parseInt(parse.getText()));
} else if(local.equals("sejong")){
air.setSejong(Integer.parseInt(parse.getText()));
}
flag = false;
}
break;
default:
break;
}
//(7)parser의 진행을 다음(태그,속성,글자...)로 이동한다.
type = parse.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return air;
}
private static String getAirList() {
HttpURLConnection conn = null;
BufferedReader rd = null;
StringBuilder sb = null;
try {
Log.v("air","try...");
StringBuilder urlBuilder = new StringBuilder("http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getCtprvnMesureLIst"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("ServiceKey", "UTF-8") + "=서비스키"); /*Service Key*/
urlBuilder.append("&" + URLEncoder.encode("itemCode", "UTF-8") + "=" + URLEncoder.encode("PM10", "UTF-8")); //미세먼지 정보만 불러옴
urlBuilder.append("&" + URLEncoder.encode("dataGubun", "UTF-8") + "=" + URLEncoder.encode("HOUR", "UTF-8")); //시간별 데이터
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); //데이터페이지중 1번페이지
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); //최신데이터 1개를 가지고온다.
URL url = new URL(urlBuilder.toString());
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
Log.v("air","Response code: " + conn.getResponseCode());
if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
Log.v("air","if...");
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
//예외처리
} catch (IOException e) {
Log.v("air","catch...");
e.printStackTrace();
} finally {
Log.v("air","finally...");
try {
rd.close();
} catch (IOException e) {
e.printStackTrace();
}
conn.disconnect();
}
return sb.toString();
}
}
(6)MainActivity
public class MainActivity extends AppCompatActivity {
TextView dataTime;
ProgressBar seoulbar;
ProgressBar busanbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataTime = (TextView)findViewById(R.id.dataTime);
seoulbar = (ProgressBar)findViewById(R.id.seoulbar);
busanbar = (ProgressBar)findViewById(R.id.busanbar);
new MyThread().execute();
}
class MyThread extends AsyncTask{
@Override
protected Object doInBackground(Object[] params){
Air air = Airservice.getAir();
Log.d("air",air.toString());
return air;
}
//주체 : mainThread
@Override
protected void onPostExecute(Object o){
Log.d("air","onPostExecute:"+o.toString());
Air air = (Air)o;
dataTime.setText(air.getDataTime());
seoulbar.setProgress(air.getSeoul());
busanbar.setProgress(air.getBusan());
}
}
}
(7)activity_main.xml
50DAY / Android / 버튼 클릭 이벤트 처리, 터치이벤트 처리
버튼 클릭 이벤트 처리
1) 액티비티에서 View타입을 매개변수로받는 메서드 생성 후
레이아웃에서 메서드 호출설정
레이아웃
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="com.example.firstapp.firstapp.MainActivity">
<Button
android:id="@+id/hellobtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click"android:onClick="testOnClick"/>
</android.support.constraint.ConstraintLayout>
액티비티
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
}
public void testonClick(View view) {
Toast.makeText(MainActivity.this, "EventTest Click", Toast.LENGTH_SHORT).show();
}
}
}
2)이벤트리스너를 사용
공통레이아웃
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="com.example.firstapp.firstapp.MainActivity">
<Button
android:id="@+id/hellobtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click"
</android.support.constraint.ConstraintLayout>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
Button button = (Button)findViewById(id.hellobtn);
button.setOnClickListener(new MyListener());
}
class MyListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "EventTest Click", Toast.LENGTH_SHORT).show();
}
}
}
3)익명클래스를 사용
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
Button button = (Button)findViewById(id.hellobtn);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "EventTest Click", Toast.LENGTH_LONG).show();
}
});
}
}
4)액티비티 스스로 이벤트리스너 구현
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
Button button = (Button)findViewById(id.hellobtn);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(this, "EventTest Click", Toast.LENGTH_LONG).show();
}
}
터치 이벤트 처리
안드로이드는 문자열을 다룰때 자바의 String타입이 아닌 CharSequence라는 자체 문자열 타입을 사용한다.
그래서 안드로이에서 생성된 문자열에 자바API를 사용할려면 먼저 toString()메서드를 이용하여 CharSequence타입을 String타입으로 변경해야 한다.
49DAY / Android Studio / 설치, 프로젝트생성, 아이콘바꾸기
안드로이드 프레임워크
C기반 개발툴
안드로이드 스튜디오 Android Studio 시작하기
안드로이드 스튜디오 다운로드
https://developer.android.com/studio/index.html
API7.0
1) 환경변수 설정하기
안드로이드 스튜디오를 사용하기 전에 Java JDK 환경변수를 설정해준다.
[제어판] - [시스템] - [시스템보호] - [고급]탭에 환경변수를 클릭한 후
아래 시스템변수 새로만들기에
변수 이름 : JAVA_HOME
변수값 : JDK설치된 경로
를 입력해준다
(2)새 프로젝트만들기
안드로이드 스튜디오 설치가 끝나면 실행하여 새로운 프로젝트를 생성한다.
프로젝트 명과 도메인 명 저장될 경로를 지정한다.
기본적으로 생성되는 액티비티와 레이아웃
(2)가상머신 설정하기
프로젝트에서 API 7 버전인 Nougat를 사용할 것이기 때문에 다운로드해준다.
디바이스 추가 완료!
휴대폰에 연결하기
(1)기종에 맞는 USB 드라이브 소프트웨어 설치후
(2)[ Tools ] - [ Android ] - [ Android Device Mointor ]
##안드로이드 스튜디오 디바이스 연결이 되지 않을 때
https://freeandroidroot.com/download-and-install-universal-adb-driver/
ADB드라이버를 설치 후 다시 시도한다.
아이콘 바꾸기
(3) AndroidMainfest.xml 파일에서 다음과 같이 수정한다.
android:icon="@mipmap/png파일명"
파일명은 영소문자만 가능하다