공공데이터(data.go.kr)에서 우편번호 가져오기
- Layout, DTO, Adapter, Listener 생성하기
- http://www.data.go.kr 에 가입
- [우편번호 정보조회] 활용 신청 -> 신청 1일 후부터 사용 가능, 일반 인증키 번호 받음
- 나. 참고문서(통합검색5자리우편번호조회서비스명세서.doc)를 참조하여 프로그래밍
- 우편번호 검색 결과 .
- MyConst.java 에 일반 인증키 번호 추가
123public class MyConst {public static final String DATA_POST_KEY = "data.go.kr에 받은 인증키 번호";} - AdnroidManifest.xml 에 인터넷 사용 가능하도록 추가
123456789101112131415161718192021222324252627<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kr.co.moak.proj001address"><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest> - DialogPostWeb 클래스 생성
123456public class DialogPostWeb extends Dialog{public DialogPostWeb(@NonNull Context context) {super(context);}} - DialogPostWeb 클래스 생성자 수정
123456789101112public class DialogPostWeb extends Dialog{private Context m_context = null;private DialogPostListener m_dialogPostListener;private ArrayList<PostDTO> m_arList = null;private PostAdapter m_adapter;public DialogPostWeb(@NonNull Context context, DialogPostListener clickListener) {super(context);this.m_context = context;this.m_dialogPostListener = clickListener;}} - FragRegister 클래스에서 DialogPostWeb 호출 부분 코딩
12345678910111213141516171819202122232425262728293031323334353637public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_register, container, false);((Button)view.findViewById(R.id.btnPostWeb)).setOnClickListener(this);return view;}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.btnSave:break;case R.id.btnPost :break;case R.id.btnPostWeb:DialogPostWeb dlgPostWeb = new DialogPostWeb(getActivity(), dlg_onClickListener);dlgPostWeb.setCancelable(true);dlgPostWeb.getWindow().setGravity(Gravity.CENTER);dlgPostWeb.show();break;}}//다이얼로그 이벤트 리스너 변수 생성private DialogPostListener dlg_onClickListener = new DialogPostListener(){@Overridepublic void onPositiveClicked(String post, String addr1) {((EditText)getView().findViewById(R.id.txtPost)).setText(post);((EditText)getView().findViewById(R.id.txtAddr1)).setText(addr1);}@Overridepublic void onNegativeClicked() {}};- 실행시켜서 Dialog를 호출하면 조그만한 대화상자가 나타남
- DialogPostWeb 클래스 onClickListener 추가
1234567891011121314151617public class DialogPostWeb extends Dialog implements View.OnClickListener{private Context m_context = null;private DialogPostListener m_dialogPostListener;private ArrayList<PostDTO> m_arList = null;private PostAdapter m_adapter;public DialogPostWeb(@NonNull Context context, DialogPostListener clickListener) {super(context);this.m_context = context;this.m_dialogPostListener = clickListener;}@Overridepublic void onClick(View v) {}} - DialogPostWeb 클래스 onCreate()메서드 추가
1234567891011121314151617181920212223242526@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);WindowManager.LayoutParams params = new WindowManager.LayoutParams();params.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;params.dimAmount = 0.8f; //뒤 배경의 어두운 정도를 나타내는 수치getWindow().setAttributes(params);setContentView(R.layout.dialog_post);((Button)this.findViewById(R.id.btnSearch)).setOnClickListener(this);ListView listView = findViewById(R.id.lstAddr);m_arList = new ArrayList<PostDTO>();m_adapter = new PostAdapter(this.getContext(), m_arList);listView.setAdapter(m_adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {String post = m_arList.get(position).post;String addr1 = m_arList.get(position).addr;m_dialogPostListener.onPositiveClicked(post, addr1);dismiss();}});}- Dialog 생성
- 검색 버튼의 리스너 연결
- ListView 생성
- ListView의 한 항목을 클릭하면 onItemClick()이 수행
- onItemClick() -> m_dialogPostListener.onPositiveClicked()
- DialogPostWeb 클래스 내부에 서브 클래스 MyAsyncTask 생성
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849public class DialogPostWeb extends Dialog implements View.OnClickListener{.........private class MyAsyncTask extends AsyncTask<String, Integer, Document> {private Context m_context;public MyAsyncTask(Context context){this.m_context = context;}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected Document doInBackground(String... urls) {URL url;Document doc = null;try{url = new URL(urls[0]);DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();doc = db.parse(new InputSource(url.openStream()));doc.getDocumentElement().normalize();}catch (Exception e){Log.v("MYTAG", "Parsing Error");}return doc;}@Overrideprotected void onPostExecute(Document doc) {m_arList.clear();NodeList nodeList = doc.getElementsByTagName("newAddressListAreaCdSearchAll");for(int i=0; i<nodeList.getLength(); i++){PostDTO dto = new PostDTO();dto.post = nodeList.item(i).getFirstChild().getTextContent();dto.addr = nodeList.item(i).getFirstChild().getNextSibling().getTextContent();m_arList.add(dto);}Log.v("MYTAG", "Count = " + m_arList.size());m_adapter.notifyDataSetChanged();}}}- <String, Integer, Document> : Document doInBackground(String)
- 첫번째 String : doInBackground()에서 받는 매개변수 타입
- 두번째 Integer : onProgressUpdate()에서 사용할 변수 타입
- 세번째 Document : doInBackground()의 리턴 타입
- onPreExecute() : 백그라운드 작업을 수행하기 전에 호출
- onProgressUpdate() :
- 백그라운드 작업의 진행 상태를 표시하기 위해 호출
- 작업 수행 중간 중간에 UI 객체에 접근하는 경우에 사용
- 작업 중간에 publishProgress()를 호출하면 실행 됨
- doInBackground() :
- 새로 만든 스레드에서 백그라운드 작업을 수행
- excute(인수1, 인수2,…)의 인수들을 배열로 전달받음
- new MyAsyncTask(getContext()).execute(strUrl);
- strUrl을 urls[0]로 받음
- onPostExecute()
- 백그라운드 작업이 끝난 후 호출
- 메인 스레드에서 실행되며 전송받은 내용을 레이아웃에 나타내거나 DB에 저장 등의 작업을 수행
- <String, Integer, Document> : Document doInBackground(String)
- DialogPostWeb 클래스 onClick() 메서드 완성
1234567891011121314151617181920@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.btnSearch :PostDAO dao = new PostDAO(m_context);String road = ((EditText)findViewById(R.id.txtRoad)).getText().toString();road = "천잠로";String strUrl = "http://openapi.epost.go.kr/postal/retrieveNewAdressAreaCdSearchAllService/retrieveNewAdressAreaCdSearchAllService/getNewAddressListAreaCdSearchAll?"+ "ServiceKey=" + MyConst.DATA_POST_KEY+ "&countPerPage=50" //최대 50+ "¤tPage=1" //출력될 페이지 번호+ "&srchwrd=" + Uri.encode(road); //검색어Log.v("MYTAG", strUrl);new MyAsyncTask(getContext()).execute(strUrl);break;}}