이클립스 배경색 바꾸기

Window - Preferences - General - Editors - Text Editors - Background color 변경

테마(skin, theme ...) 변경하기



 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


1. 엑셀파일 변환하기



먼저 엑셀파일을 구분자로 나눠진 파일로 변환한다. 

(1)쉼표로 분리한 .csv 파일이나 (2)탭으로 분리된 텍스트파일중 상황에 맞게 할 수 있다.


2. SQLite DB에 import하기

1) 위에서 생성한 파일을 android SDK가 설치된 디렉토리 내 tools 폴더로 이동한다. 

그리고 커맨트 창을 띄우고 tools 폴더로 이동한다.



2) .db 파일을 생성한다. sqlite2.exe [db파일명] 으로 생성하거나 기본의 db파일을 읽어온다.

테이블을 생성하고 테이블을 확인해보았다.


DB 명령문


3) .separator "[구분자]" 명령어를 통해 구분자를 구분하고, .import [구분되어진 파일] [테이블명] 으로 데이터를 가져온다. import할 파일은 확장자까지 입력한다. 

데이터가 import되었는지 확인하기 위해서는 sqlite>select * from [테이블명]; 으로 확인한다.




Android Studio(IntelliJ) 단축키 변경하기

평소 이클립스를 사용하다 안드로이드 스튜디오를 사용하려니 단축키가 많이 달라 불편한 점이 많았다. 하지만 이클립스 단축키를 그대로 사용하는 방법이 있다.

File - Settings 에서 Keymap 탭에서 Keymaps에서 Eclipse 를 선택한다.





파이썬(Python) 예약어

and  del  from  nonlacal  try  as  elif  global  not  while  assert  else  if  or  with  break  except  import  pass  yield  class  exec  in  print  continue  finally  is  raise  def  for  lambda  return


식사하는 철학자(Dining Philosopher) 문제 구현하기

이미 java.util.concurrent.Semaphore 로 세마포어를 사용할 수 있지만 직접 만들어 보도록 한다. 이 코드가 세마포어를 구현한 것인지 확실하진 않다. 단지 내가 이해한 세마포어를 구현해보았다. 

+ 세마포어란 하나의 공유변수를 사용하는데 아래 코드는 각 객체안의 변수를 사용하므로 모니터가 맞는것 같다...

코드 : 식사하는 4명의 철학자

DiningTable.java


Chopstick.java


Philosopher.java



결과화면

  



homework_0604.zip


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

List의 중복된 값을 제거하고 정렬한다. 


해결방안

ArrayList<String> tempList = new ArrayList<String>();
ArrayList<String> dataList;

dataList = new ArrayList<String>(new HashSet<String>(tempList));
Collections.sort(dataList);

2019.10.11. 옛날 코드를 보니 다이아몬드 연산자도 안쓰고, 다형성도 활용하지 않고, 사이드이펙트있는 정렬 메서드 쓰고 있어서... 새로 수정 with 자바8람다

List<String> duplicateStringList = Arrays.asList("2", "2", "1", "3");
List<String> result = duplicateStringList.stream()
.distinct()
.sorted()
.collect(Collectors.toList());



한글 깨지는 *.txt 파일 읽기

String path="fileName.txt";
BufferedReader reader = new BufferedReader(new InputStreamReader(
						new FileInputStream(path), "euc-kr"));

UTF-8 파일 쓰기

String path="fileName.txt";
BufferedWriterreader = new BufferedWriter(new OutputStreamWriter(
						new FileOutputStream(path), "utf-8"));




자바를 다루는 기술

저자
김병부 지음
출판사
길벗 | 2014-02-24 출간
카테고리
컴퓨터/IT
책소개
자바 언어의 기초 문법을 친절하고 자세하게 설명한다. 객체 지향...
가격비교

 

객체와 인스턴스의 차이점

 비슷한 개념이지만 정확히 구별하면 인스턴스가 객체보다 큰 의미이다. 객체는 어떤 클래스를 사용해서 만들어진 것을 의미한다. 그리고 그 객체가 메모리에 할당되어 실제 메모리를 차지하는 것을 인스턴스라고 한다.  


String str;
str = new String("Hello world");
System.out.println(str);

위와 같은 코드에서 객체와 인스턴스를 구별해보자.

먼저 str은 String 클래스를 사용하여 객체를 선언한 것이다. 즉 아직 str에 문자열이 할당되어 있지 않은 상태이다. 

그리고 다음 라인을 보자. new 키워드를 사용하여 JVM에 데이터가 생성된 것을 보여준다. 이렇게 객체를 실제로 메모리에 할당하는 과정을 인스턴스화(instantiate)라고 한다. 즉 객체 str에 "Hello world"라는 문자열을 할당해서 인스턴화하였다. 그리고 이렇게 인스턴스화된 것을 인스턴스라고 부른다.




JDK 개발 도구 명령어

java

컴파일된 바이트 코드 파일(*.class)을 실행하는 명령어

  • 사용법 : java [클래스명]
  • 사용예 : java Helloworld

javac

자바 컴파일 명령어로 자바 코드로 작성된 파일을 실행 가능한 '.class'로 컴파일해준다.

  • 사용법 : javac [Java 파일명]
  • 사용예 : javac Helloworld.java


jar

자바에서 사용되는 묶음 파일인 Jar 파일을 다루기 위한 명령어. Jar 파일은 클래스 파일들을 편리하고 효율적으로 배포하기 위해 실행에 필요한 여러 파일들을 묶어 하나의 파일로 만든 것이다. 주로 외부 라이브러리들을 배포하거나 애플리케이션을 패치하는데 많이 사용된다. 

  • 묶는 법 : jar -xvf [대상 디렉토리 혹은 Class 파일들]
  • 푸는 법 : jar -cvf [jar 파일 경오]


javadoc

Java 문서를 만들어주는 명령어.

  • 사용법 : javadoc [Java 파일 명]

jps

현재 실행 중인 자바 프로세스들의 이름과 프로세스 ID를 보여주는 명령어

  • 사용법 : jps

jmap

JVM의 힙 메모리 상태를 확인할 수 있는 명령어. JVM의 힙 영역의 상태를 확인하는 것을 메모리 덤프나 메모리 절단면이라고 한다. 애플리케이션의 유지 보수 혹은 애플리케이션에서 에러가 발생했을 때 원인을 찾기 위해서 많이 사용하는 명령어.

  • 사용법 : jmap -heap:format=b,file=[저장할 dump 파일명][pid]

jhat

jmap을 사용하여 생성한 메모리 덤프 파일을 분석해주는 명령어. 이 명령어를 이용하면 스스로 웹서버를 띄워서 html 형식으로 분석된 내용을 보여준다. 보통 jps, jmap 그리고 jhat은 에러의 원인 분석이나 JVM 상태를 모니터링 하기 위해서 사용한다.

  • 사용법 : jhat [저장한 dump 파일명]


참고도서  : 자바를 다루는 기술 

Heap Sort Algorithm Source

package heapSort;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class Star {

	public static void main(String args[]) {

		ArrayList<String> data = new ArrayList<String>();
		String file_open_path = "D:/heapData.txt";

		fileRead(file_open_path, data);
		
		System.out.println(data);
		data = heapSort(data);
		System.out.println(data);

	}

	public static ArrayList<String> heapDown(ArrayList<String> data) {
		for (int n = (data.size() / 2) - 1; n >= 0; n--) {
			int leftChild = (n * 2) + 1;
			int rightChild = (n * 2) + 2;

			if (data.get(leftChild).compareTo(data.get(n)) < 0) {
				swapData(data, n, leftChild);
			}

			if (rightChild < data.size()) {
				if (data.get(rightChild).compareTo(data.get(n)) < 0) {
					swapData(data, n, rightChild);
				}
			}
		}
		return data;
	}

	public static ArrayList<String> heapSort(ArrayList<String> data) {
		ArrayList<String> sortedData = new ArrayList<String>();

		int len = data.size();
		data = heapDown(data);

		for (int i = 0; i < len; i++) {
			sortedData.add(0, data.remove(0));
			data = heapDown(data);
		}
		return sortedData;
	}

	private static void fileRead(String path, List<String> data) {
		BufferedReader reader = null;

		if (path != null) {
			try {
				reader = new BufferedReader(new FileReader(path));

				String line = null;
				while ((line = reader.readLine()) != null) {
					if (line.charAt(0) == 65279) {
						data.add(new String(new StringBuffer(line)
								.deleteCharAt(0)));
					} else {
						data.add(line);
					}
				}
				reader.close();
			} catch (Exception e) {
				System.err.println(e);
			} finally {
				try {
					if (reader != null) {
						reader.close();
					}
				} catch (Exception ex) {
				}
			}
		}
	}

	private static void swapData(ArrayList<String> data, int a, int b) {
		String temp;
		temp = data.get(a);
		data.set(a, data.get(b));
		data.set(b, temp);
	}
}


ArrayList 합집합(union)

	public <T> List<T> union(List<T> list1, List<T> list2) {
		Set<T> set = new HashSet<T>();

		set.addAll(list1);
		set.addAll(list2);

		return new ArrayList<T>(set);
	}

ArrayList 교집합(intersection)

	public <T> List<T> intersection(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<T>();

		for (T t : list1) {
			if (list2.contains(t)) {
				list.add(t);
			}
		}

		return list;
	}

사용예시

public class ListUtil {

	public static void main(String... args) throws Exception {

		List<String> list1 = new ArrayList<String>(Arrays.asList("A", "B", "C"));
		List<String> list2 = new ArrayList<String>(Arrays.asList("B", "C", "D",
				"E", "F"));

		System.out.println("교집합" + new ListUtil().intersection(list1, list2));
		System.out.println("합집합" + new ListUtil().union(list1, list2));
	}

	public <T> List<T> union(List<T> list1, List<T> list2) {
		Set<T> set = new HashSet<T>();

		set.addAll(list1);
		set.addAll(list2);

		return new ArrayList<T>(set);
	}

	public <T> List<T> intersection(List<T> list1, List<T> list2) {
		List<T> list = new ArrayList<T>();

		for (T t : list1) {
			if (list2.contains(t)) {
				list.add(t);
			}
		}

		return list;
	}
}



'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] JDK 개발 도구 명령어  (0) 2014.07.16
[JAVA] HeapSort Algorithm  (0) 2014.07.09
[JAVA] java.io.RandomAccessFile() (작성중)  (0) 2014.05.27
[JAVA] 전기 요금 계산  (0) 2014.05.14

액티비티의 생명주기

사진 출처(Android API)


  • 액티비티는 시작, 실행, 활성, 비활성화, 정지, 종료상태를 순환한다.
  • 시스템은 태스크[각주:1]의 실행중인 액티비티들을 스택으로 관리한다.


스택상의 액티비티의 세 가지 상태

  • 실행(active, running)
스택의 제일 위에 있는 상태로, 사용자가 화면으로 볼 수 있고,
입력 포커스를 가지며 사용자에게 입력을 받을 수 있는 상태이다.
  • 일시 정지(pause)
포커스는 잃었지만 사용자에게 일부 보이는 상태이다.
다 가리지 않았더나 반투명한 상태를 말한다.
  • 정지(stopped)
다른 액티비티에 의해 완전히 가려진 상태로, 사용자가 화면에서 볼 수 없다.
시스템은 메모리가 부족하면 정지 상태의 액티비티를 언제든지 강제 종료 가능하다.


참고자료, 사이트


  1. 태스크(Task)는 사용자가 실질적으로 "하나의 어플리케이션처럼" 느끼는 액티비티들의 집합. [본문으로]

 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


GoogleMaps v2 Marker 추가하기

구글맵이 화면에 올라와있다고 가정하에 아래 코드 작성.
LatLng loc = new LatLng(x, y); // 위치 좌표 설정
MarkerOptions marker = new MarkerOptions().position(loc);
mGoogleMap.addMarker(marker); // 마커표시
예제
public class MapTest extends FragmentActivity {

	// 초기화
	GoogleMap mGoogleMap; // 구글맵 객체
	LatLng loc = new LatLng(0, 0); // 위치 좌표 설정
	CameraPosition cp = new CameraPosition.Builder().target((loc)).zoom(16)
			.build();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_map_test);

		// 구글 맵 객체 생성
		mGoogleMap = ((SupportMapFragment) getSupportFragmentManager()
				.findFragmentById(R.id.map)).getMap();

		moveDisplay(35.864144, 129.194698, 19);
		addMarker(35.864144, 129.194698);


	// 마커 추가하기
	void addMarker(double x, double y) {
		LatLng loc = new LatLng(x, y); // 위치 좌표 설정
		MarkerOptions marker = new MarkerOptions().position(loc);
		mGoogleMap.addMarker(marker); // 마커표시
	}

	// 화면 이동하기
	void moveDisplay(double x, double y, int zoom) {
		LatLng loc = new LatLng(x, y); // 위치 좌표 설정
		CameraPosition cp = new CameraPosition.Builder().target((loc))
				.zoom(zoom).build();
		mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cp));
	}
}

GoogleMaps v2 Marker 삭제하기

dddd


이클립스 글자색 바꾸기(Color Theme)

Eclipse Color Themes Download Site Link


▶ 먼저 위 링크를 통해 아래사진과 같은 사이트에서 원하는 Theme를 선택하여 다운받는다. 이때 다운로드는 Eclipse Preferences(EPF)를 받는다.




▶ 이클립스에서 File - Import - Preferences 를 통해 다운받은 Theme 파일을 적용시킨다.






원래 상태(default)로 변경하기

"Windows>Preferences>Java>Editor"에서 Syntax Coloring - "Restore Defaults"하고 "Apply"합니다.

그리고 "General>Editors"에서 Text Editors에 들어가셔서 마찬가지지로 "Restore Defaults"하고 "Apply"하시면 원래상태로 돌아옵니다




1. Eclipse 다운받기

▶ 이클립스 4.4 루나에서 추가된 점 링크이동

2. Dark Theme 적용하기

Window - Preferences - General - Appearance 선택 후 Theme 변경





2.1 변경 후 Color Theme

▶ 변경 후 코드창이 밝아 사용하기 어렵다. 아래 링크를 통해 Color Theme 를 변경한다.

[Eclipse] 이클립스 글자색, 배경색 바꾸기(color themes change)


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

  • 구글맵에 여러개의 마커를 추가하려고한다.
  • 이동경로를 표시하기 위해 마커를 사용하고, 마커를 찍는 방법은 다른 스레드를 생성하여 실행한다.


해결방안

구글맵의 문제가 아니었다. 안드로이드에서는 화면 UI를 변경하려면 하나의 액티비티에서만 가능하다.

그렇게 때문에 main이 아닌 다른 스레드에서 마커를 찍어주니 에러가 발생하였다.

그래서 Handler를 만들어주고 다른 Thread에서 호출하였다.


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


안드로이드 메일보내기

Intent it = new Intent(Intent.ACTION_SEND); String[] mailaddr = {"opid911@gmail.com"}; it.setType("plaine/text"); it.putExtra(Intent.EXTRA_EMAIL, mailaddr); // 받는사람 it.putExtra(Intent.EXTRA_SUBJECT, "[wisay]"); // 제목 it.putExtra(Intent.EXTRA_TEXT, "\n\n" + "v" + appVersion); // 첨부내용 startActivity(it);

받는주소에는 문자열배열이 아니면 안되는것 같다.


ListView에 Scrollbar 감추기

listview.xml

<ListView android:id="@+id/listview" ... android:scrollbars="none" >

ListView에 이동하는 스크롤바 적용하기(fast scroll)

listview.xml

<ListView android:id="@+id/listview" ... android:fastScrollEnabled="true" >


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TabHost
        android:id="@+id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1" >
            </FrameLayout>

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </TabHost>
</LinearLayout>

tabhost의 id가 @android:id/tabhost가 아닌 @+id/tabhost 이다.

위 tab은 FrameLayout 속성에 layout_weight="1" 때문에 하단에 위치하게 된다.


MainActivity.java

public class MainActivity extends ActivityGroup {
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		createTab();
	}

	private void createTab() {
		TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
		tabHost.setup(getLocalActivityManager());

		tabHost.addTab(tabHost.newTabSpec("TAB1").setIndicator("TAB1")
				.setContent(new Intent(this, Tab1Activity.class)));
		tabHost.addTab(tabHost.newTabSpec("TAB2").setIndicator("TAB2")
				.setContent(new Intent(this, Tab2Activity.class)));

		}

	}
}


참고 사이트



어플리케이션 버전 가져오기

// 어플 버전 가져오기
PackageInfo pi = null;
try {
	pi = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
	Log.e(TAG, e.getMessage());
}
String appVersion = pi.versionName;
Int appCode = pi.versionCode; 


자바코드(activity)에서 setText()로 값 변경시 태그넣기

TextView t1 = (TextView)findViewById(R.id.t1);
t1.setText(Html.fromHtml("1번째줄" + "<br />" + "2번째줄"));


자바코드(or Activity)에서 string.xml 값 가져오기

String st1 = getString(R.string.s1);
CharSequence st2 = getText(R.string.s2);


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


Google Maps Android API v2 (구글 맵) 사용하기


구글에서 제공하는 사용 방법(링크)


1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

2. 새 프로젝트에서 구글맵 라이브러리 프로젝트 가져오기

3. 인증키 발급받기

 3-1. 디버깅용

  3-1-1. cmd창에서 확인하기

  3-1-2. 이클립스에서 확인하기

 3-2. 릴리즈용

4. 구글맵 인증키 발급받기

5. 구글맵 사용하기



1. 구글맵 라이브러리 다운로드 및 프로젝트 생성하기

 1-1. Google Play services SDK 다운로드하기

  Android SDK Manager - Google Play services 를 설치한다.


 1-2. 구글맵 라이브러리를 가져오기.

  1-2-1. Ctrl + N -> Android Project from Existing Code 를 선택한다.


  1-2-2. Root Directory 에 설치한 구글맵 라이브러리 경로를 지정해준다.

SDK경로\extras\google\google_play_services\libproject\google-play-services_lib



2. 구글맵을 사용할 새로운 프로젝트 생성하기.

  2-1. 프로젝트를 생성하고, 프로젝트를 오른쪽 클린한 후 Properties(속성)를 선택한다.

 


  2-2. 하단의 Library창에서 Add를 통해 가져온 프로젝트 추가해준다.





3. 인증키 발급받기

 3-1. 디버깅용 키 지문 확인하기.

  3-1-1. cmd(commend)창에서 확인하기.

1. OS별로 아래 경로로 이동

 OS X, Linux

  ~/.android

 윈도우 xp

  C:/Documents and Settings/사용자 계정/.android

 윈도우 7

  C:/Users/사용자 계정/.android


2. 명령어 실행

 keytool -v -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android

 혹은 -keystore 값에 경로를 함께 지정해도 된다.


  3-1-2. 이클립스에서 확인하기

   Window - Preferences -> Android - Build


 3-2. 릴리즈용

....


4. SHA1 지문으로 구글 키 발급받기

 4-1. Google APIs console로 이동한 뒤에 프로젝트를 생성한다.


4-2. 좌측 메뉴중 APIs & auth - APIs 에서 Google Maps Android API v2 를 찾아 활성화시켜준다.


 4-3. APIs & auth - Credentials 에서 Public API access의 CREATE NEW KEY를 선택하고, Android key를 선택한다.



 4-4. 아래와 같은 창이 나오면 위에서 확인했던 SH1키와 같이 현재 작업중인 패키지를 넣는다.

예) [SHA1지문];[현재 작업중인 패키지 이름]

AF:3B:EF:67:CE:A1:5C:7D:C2:3F:C4:99:8B:63:7F:F5:92:83:E2:11;com.example.googlemap_v2



 4-5. 아래와 같이 키가 발급되었다.


5. 구글 맵 사용하기(code)

 5-1. 매니페스트 설정하기.

  5-1-1. Manifest 탭


   5-1-2. Application 탭(Meta Data 2개를 추가해야 한다.)

   5-1-3. Permissions 탭

1개의 permission과 7개의 user-permission을 추가한다.

<permission
    android:name="com.example.maptest.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" >
</permission>
<uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



JAVA CODE

   5-1-4. AndroidManifest.xml에서 바로 추가할 수도 있다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.maptest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <permission
        android:name="com.example.maptest.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" >
    </permission>

    <uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.maptest.MapTest"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="KEY" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>

</manifest>


  5-2. layout에 fragment 추가하기

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapTest" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <fragment 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"/>

</RelativeLayout>


  5-3. MainActivity에 FragmentActivity 상속 받기

public class MainActivity extends FragmentActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


참고자료



자바캔에서 구현이 잘되어있어서 본문글 자체를 그래도 가져온 글입니다. 본문글은 이곳입니다.

(문제가 생긴다면 삭제하도록 하겠습니다.)


안드로이드에서 2회 연속 백버튼을 눌러서 앱을 종료시키는 경우가 흔한데, 이 기능은 많이 사용되므로 다음과 같이 별도 클래스로 기능을 분리하면 향후 기능 재사용이 편리하다.

public class BackPressCloseHandler {

	private long backKeyPressedTime = 0;
	private Toast toast;

	private Activity activity;

	public BackPressCloseHandler(Activity context) {
		this.activity = context;
	}

	public void onBackPressed() {
		if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
			backKeyPressedTime = System.currentTimeMillis();
			showGuide();
			return;
		}
		if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
			activity.finish();
			toast.cancel();
		}
	}


	private void showGuide() {
		toast = Toast.makeText(activity, "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.",
				Toast.LENGTH_SHORT);
		toast.show();
	}

}

BackPressCloseHandler의 구현은 간단하다.

  • backKeyPressedTime은 백버튼이 눌린 마지막 시간을 기록한다.
  • onBackPressed() 메서드는 현재 시간이 마지막 백버튼 누른 시간으로부터 
    • 2초 이상 지났으면, 마지막 백버튼 눌린 시간을 현재 시간으로 갱신하고 showGuide()를 실행한다.
    • 2초 이상 지나지 않았으면, Activity를 종료한다.
    • 참고로, 2초는 Toast.LENGTH_SHORT의 기본 값이다.
  • showGuide() 메서드는 Toast를 이용해서 메시지를 출력한다.

2회 연속 백버튼 누를 때 종료시키고 싶은 Activity가 있다면, 다음과 같이 사용한다.

  • BackPressCloseHandler 타입의  backPressCloseHandler 필드를 추가한다.
  • onCreate() 메서드에서 BackPressCloseHandler 객체를 생성해서 필드에 할당한다.
  • onBackPressed() 메서드에서 backPressCloseHandler.onBackPressed()를 호출한다.
아래 코드는 실제 적용한 코드의 일부를 발췌한 것이다.


public class HomeActivity extends Activity ... {

	private BackPressCloseHandler backPressCloseHandler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.home_layout);
		...
		backPressCloseHandler = new BackPressCloseHandler(this);
	}

	@Override
	public void onBackPressed() {
		backPressCloseHandler.onBackPressed();
	}
}


문제점

다이얼로그에서 버튼을 클릭하면 닫히는 것을 막으려고 한다. 
참고사이트

해결방안

기존 리스너는 버튼만 만들어주고 AlertDialog 객체를 통해 오버라이딩해서 사용한다. 
그리고 아래 조건문을 통해 dimiss()를 제어한다.

코드

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		tvName = (TextView) findViewById(R.id.tvName);
		btnClick = (Button) findViewById(R.id.btnClick);

		btnClick.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				dialogView = (View) View.inflate(asdasd.this, R.layout.dialog,
						null);

				AlertDialog.Builder builder = new AlertDialog.Builder(
						asdasd.this);
				builder.setMessage("Test input data");
				builder.setView(dialogView);
				builder.setPositiveButton("ok",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				builder.setNegativeButton("clear",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
							}
						});
				final AlertDialog dialog = builder.create();
				dialog.show();

				dlg_edt_name = (EditText) dialogView
						.findViewById(R.id.dlg_edt_name);

				dialog.getButton(AlertDialog.BUTTON_POSITIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = true;

								tvName.setText(dlg_edt_name.getText());

								if (wantToCloseDialog)
									dialog.dismiss();
							}
						});
				dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
						.setOnClickListener(new View.OnClickListener() {
							@Override
							public void onClick(View v) {
								Boolean wantToCloseDialog = false;

								dlg_edt_name.setText("");

								if (wantToCloseDialog)
									dialog.dismiss();

							}
						});
			}
		});
	}


dialogExam.zip


+ Recent posts