2017 JAVA 교육수료

61DAY / jQuery 메서드

2017. 6. 30. 09:16

선택기 메서드

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);

});



공공api를 이용한 미세먼지 확인 앱 만들기


(1)공공api를 얻기위해  권한을 신청한다. 저번에 신청한 api를 사용하겠다

https://www.data.go.kr/


(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





버튼 클릭 이벤트 처리


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();

}
}



터치 이벤트 처리

(1)새 프로젝트를 생성한다

(2) TextView 위젯을 생성하고 
    높이와 넓이를 match_parent 타입으로 설정하여 화면 전체를 덮는다



(3) 액티비티


화면에서 터치가 끝날 때 x좌표값을 받아서 처음 터치시좌표와 비교후 
증가인지 감소인지(우측으로 이동했냐 좌측으로 이동했냐)에 따라 분기시킨다.
-10 , +10 으로 값을 설정한 이유는 너무 작은 값에는 반응하지 않도록 하기위해서이다.

 
true를 리턴하면 이벤트를 소멸시키면서 다음이벤트로 진행되지 않는다.


안드로이드는 문자열을 다룰때 자바의 String타입이 아닌 CharSequence라는 자체 문자열 타입을 사용한다. 

그래서 안드로이에서 생성된 문자열에 자바API를 사용할려면 먼저 toString()메서드를 이용하여 CharSequence타입을 String타입으로 변경해야 한다.



안드로이드  프레임워크

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드라이버를 설치 후 다시 시도한다.


아이콘 바꾸기

(1)아이콘을 다운로드 받는다

무료아이콘 지원하는 사이트

(2) mipmap 폴더안에 png파일을 붙여넣는다


(3) AndroidMainfest.xml 파일에서 다음과 같이 수정한다.


android:icon="@mipmap/png파일명"

파일명은 영소문자만 가능하다



+ Recent posts