[Android] 외부(오픈소스) 라이브러리 사용하기

Published on: 2013. 11. 14. 16:26 by louis.dev
안드로이드 프로젝트 같은경우에는 github구글 코드 같은 사이트에서 안드로이드용 오픈소스 라이브러리를 많이 볼수 있습니다. 이러한 오픈소스 라이브러리를 안드로이드 프로젝트에서 사용하는 방법을 적어보자 합니다. Step 1. 외부라이브러리를 다운로드 받아 이클립스로 import 합니다. android 3.0에서 부터  Actionbar라는 뷰가 생겼는데요, 하위버전의 안드로이드에서는 Actionbar를 사용할수가 없어 ActionbarSherlock이라는 외부라이브러리를 이용해서 Actionbar를 구현해야 합니다. 해당사이트로 이동하여 라이브러리를 다운 받은 후 압축을 풉니다. 다음으로 이클립스로 돌아와 해당 라이브러리 프로젝트를 import 시켜줍니다.  
일반 적인 경우에는 아래의 스크린샷 처럼 Android -> Existing Android Code Into Workspace 메뉴를 선택하여  import를 시키면 됩니다.  

 그러나 Actionbar Sherlock 라이브러리를 보면 pom.xml이 있는것을 확인할수 있습니다. 즉 해당 라이브러리는 Maven 기반의 프로젝트임을 확인할 수 있습니다. 이렇게 외부 라이브러리가 Maven기반이라면 아래의 사진처럼 Maven -> Existing Maven Project 를 선택하여 Maven 프로젝트를 import 시킵니다. 안드로이드 프로젝트에서 Maven을 사용하려면 이클립스 플러그인이 설치되어야 합니다. 안드로이드-메이븐 개발환경 구축은 "Maven으로 안드로이드 개발환경 구축하기"를 참고하시면 됩니다.

   

 위의 화면에서 Next를 누르면 다음과 같은 화면이 나오는데요.  

실질적으로 필요한 프로젝트는 library이지만 샘플코드도 확인해야 하기 때문에 저는 모든 프로젝트를 import 하겠습니다. Step 2. 외부라이브러리를 현재 개발하려는 프로젝트에 추가 합니다. 추가는 간단합니다. 현재 프로젝트에서 마우스 오른쪽을 클릭하여 properties메뉴로 들어갑니다.

   

 좌측메뉴 중 Android를 선택하면 다음과 같은 화면이 나타나는데요.

   

우측 하단의 Library영역에서 Add를 눌러 라이브러리 프로젝트인 Actionbar Sherlock을 선택합니다.

   

 위의 스크린샷처럼 Library영역에 actionbarsherlock 프로젝트가 라이브러리로 추가된걸 볼 수 있습니다.   이렇게 외부라이브러리를 추가하는 방법을 확인해 보았습니다. 만약 현재 개발중인 프로젝트가 Maven을 사용하고 있다면 위의 작업을 한 뒤 pom.xml의 dependency부분에 apklib 디펜던시를 추가해 주어야 합니다.
<dependencies>
	<dependency>
		<groupId>com.actionbarsherlock</groupId>
		<artifactId>library</artifactId>
		<version>4.2.0</version>
		<type>apklib</type>
	</dependency>
</dependencies>
 

Maven환경에서 개발 시 유의할점

위의 포스팅을 쭉 읽어 오면서 이상한 점이 하나 보일것입니다. Maven환경에서 개발을 많이 해보신 경우라면 좀더 빨리 눈치 채실것 같은데요. 그 이상한 점은 바로 apklib파일을 pom.xml에 dependency로 추가를 했는데도 불구하고 project의 properties 메뉴에서 외부라이브러리를 중복적으로 추가하고 있다는 점입니다. 일반적으로 의존관계의 jar로 패키징된 라이브러리들은 pom.xml에 dependency를 추가만 해주는것만으로도 자연스럽게 디펜던시에 추가가 되어 따로 설정 할일이 없었는데 apklib파일 같은 경우는 왜이렇게 중복적으로 라이브러리를 지정해야 할까요? 그 이유는 Maven프로젝트를 android프로젝트로 인식하는 Android Connector for m2e  플러그인이 apklib를 아직 미지원 하기 때문입니다. 그렇기 때문에 pom.xml에 dependency를 추가했어도 android connector plugin이 apklib를 인식하지 못하기 때문에 외부라이브러리를 찾지 못한다고 이클립스에서 에러를 내뿜게 됩니다. 그렇다고 실제 dependency에 추가가 되지 않은 것은 아니며 단지 이클립스에서 인식을 못하는 것입니다. 그래서 이렇게 에러가 발생하더라도 해당 프로젝트를 maven으로 패키징 하게 되면 문제가 없이 패키징이 되는것을 확인할 수 있습니다. 하지만 개발을 하기 위해서는 이클립스에서 외부라이브러리를 인식시켜 이클립스가 제공해주는 다양한 기능(code assist같은) 을 사용해야 하기 때문에 Properties에서 외부라이브러리를 추가해 주어야 합니다.



[Android] Maven으로 안드로이드 개발환경 구축하기

Published on: 2013. 11. 14. 16:23 by louis.dev
이번에 안드로이드 프로젝트를 진행하면서 자바 웹 개발시에도 많이 사용하는 Maven을 이용해 안드로이드도 개발을 진행하도록 하였습니다. 모든 자바 프로젝트가 그렇듯 세팅에 많은 시간을 들여야 하기 때문에 나중에 혹시 또 안드로이드 프로젝트를 진행할때 참고하려고 히스토리를 남겨 봅니다.

첫번째. Maven을 설치해 줍니다.

당연하겠지만 Maven을 사용하려면 Maven을 설치를 해야겠지요..^^;; Maven은 apache사이트에서 다운로드 받으실수 있습니다. 설치하는 방법은 아주 간단합니다. 다운로드받은 .zip파일을 원하는 곳에 압축을 풀어 놓습니다. 그리고 환경변수로 MAVEN_HOME을 지정해야 하는데 이 MAVEN_HOME은 다운로드 받은 메이븐 파일을 압축풀어 놓은 위치를 MAVEN_HOME으로 지정하면 됩니다. * 참고로 MAVEN-ANDROID-PLUGIN은 MAVEN 3.3이상 MAVEN 3.0.3버전 사용을 요구하고 있습니다. 그러므로 MAVEN을 설치하실때는 꼭 3.0.3이상의 버전을 설치하시기 바랍니다.  

두번째. Android-SDK, 이클립스를 다운받습니다.

예전같은 경우에는 이클립스 따로, Android-SDK 따로 다운받아서 이클립스 플러그인을 설치하는 번거로운 작업을 진행했어야 하는데요, 요즘에는 안드로이드 개발자 사이트에 가면 ADT Bundle을 다운로드 받을 수 있는데 여기에 Android-SDK뿐만 아니라  이클립스가 함께 포함되어있습니다. 이걸 다운로드 받으면 따로 안드로이드 이클립스 플러그인을 다운로드 받지 않아도 되기 때문에 좀더 빠르게 개발환경을 구축할수 있습니다. 여기서 가장 중요한 점은 위에서 환경변수로 MAVEN_HOME을 잡아줬던것처럼 안드로이드SDK 설치에서도 ANDROID_HOME을 환경변수로 지정해 주어야 합니다.  위의 내용처럼 ADT bundle을 다운로드 받으셨다면 SDK의 위치는 ${ADT Bundle설치 디렉토리}/sdk 입니다. 이 위치를 ANDROID_HOME으로 지정하면 됩니다.  

세번째. Maven-eclipse플러그인인 m2e 플러그인을 설치합니다.

설치방법은 다른 이클립스 플러그인을 설치하는 방법과 동일합니다. eclipse 메뉴의 Help -> Install New Software에서 http://download.eclipse.org/technology/m2e/releases 를 입력한 뒤 플러그인을 설치합니다.  

 다음으로 Android Connector for M2E 이클립스 플러그인을 위와같은 방식으로 설치합니다. 설치 위치는 http://rgladwell.github.com/m2e-android/updates/ 입니다.  

네번째. 안드로이드 프로젝트를 생성합니다.

Maven의 android archetype을 이용해서 안드로이드 프로젝트를 생성할 수 있으나 저는 반대로 안드로이드 프로젝트 생성후 Maven프로젝트로 변환하도록 하겠습니다.  
위와 같이 기본 안드로이드 프로젝트를 생성하듯이 생성합니다. 그리고 생성된 프로젝트의 마우스 오른쪽을 눌러 Maven project로 변환합니다.

   

위의 화면에서 GroupId와 Artifact Id를 지정합니다. 여기서 봐야 할부분은 Packaging부분인데요. 안드로이드 프로젝트가 패키징 되면 .apk파일이 생성이 되는데 위의 그림에서는 Packaging에서는 apk를 선택할 수 없습니다. 하지만 이부분은 pom.xml부분에서 수동으로 설정가능하니 그냥 기본설정인 .jar로 선택하시고 finish를 누르면 됩니다.

다섯째. pom.xml에 android-maven-plugin을 추가 및 기타 설정을 합니다.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>net.krespo.android</groupId>
	<artifactId>KrespoAndroid</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>apk</packaging>
	<dependencies>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>android</artifactId>
			<version>1.5_r4</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>

	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
				<artifactId>android-maven-plugin</artifactId>
				<version>3.6.0</version>
				<configuration>
					<androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
					<assetsDirectory>${project.basedir}/assets</assetsDirectory>
					<resourceDirectory>${project.basedir}/res</resourceDirectory>
					<nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
					<sdk>
						<path>${env.ANDROID_HOME}</path>
						<platform>16</platform>
					</sdk>
					<undeployBeforeDeploy>true</undeployBeforeDeploy>
				</configuration>
				<extensions>true</extensions>
			</plugin>

			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.0</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
이렇게 되면 기본적인 Maven-Android프로젝트는 세팅이 끝납니다. 그런데 프로젝트를 살펴보면 Android Dependencies 부분에 android-support-v4.jar가 추가 된 것을 볼수 있는데 프로젝트의 libs디렉토리에 해당 jar파일이 추가 되어 빌드패스에 추가된 것을 볼수 있습니다. 앞으로 모든 프로젝트의 라이브러리는 Maven에서 관리될 것이기 때문에 libs디렉토리의 android-support-v4.jar를 제거하고 pom.xml에 dependency를 추가합니다. 

<dependency>
	<groupId>com.google.android</groupId>
	<artifactId>support-v4</artifactId>
	<version>r7</version>
</dependency>
추가 : 댓글에 지적해주신 부분과 같이 메이픈 공식 repository에 있는 support-v4 라이브러리 버전이 너무 낮아 다른 라이브러리들과 호환문제가 발생할 수 있습니다. 그럴때는 프로젝트 libs디렉토리의 support-v4라이브러리를 삭제 하지 말고 다음과 같이 pom.xml에 선언해 주면 로컬의 라이브러리를 가져와 사용할 수 있습니다.  
<dependency>
	<groupId>com.google.android</groupId>
	<artifactId>support-v4</artifactId>
	<version>r21</version>
	<scope>system</scope>
	<systemPath>${basedir}/libs/android-support-v4.jar</systemPath>
</dependency>
위와같이 프로젝트 세팅을 완료하였습니다. 프로젝트를 빌드하는 방식은 기존의 Maven프로젝트를 빌드하듯이 package 골을 이용하여 빌드합니다. 만약 연결된 스마트 폰으로 빌드된 apk를 올려서 테스트를 하려고 한다면 다음과 같은 골을 실행시키면 됩니다.
mvn package android:deploy android:run
package - apk 파일로 생성 android:deploy - 연결된 스마트 폰으로 apk파일 배포 android:run - 스마트폰에 deploy되면 자동으로 배포된 apk를 실행   이상으로 android프로젝트에서 Maven을 사용하는 방법을 포스팅 했습니다. 개인적으로 아직 안드로이드와 Maven조합은 안정성이 있어 보이지는 않습니다. 부득이한 경우(전사 표준이라던가 하는)가 아니라면 아직 안드로이드 프로젝트에 메이븐을 적용하는 것은 시기상조인것 같네요.^^ Troubleshooting 환경변수에 ANDROID_HOME을 설정했음에도 빌드시 아래와 같은 에러가 발생한다면

org.apache.maven.plugin.MojoExecutionException: No Android SDK path could be found. You may configure it in the plugin configuration section in the pom file using <sdk><path>...</path></sdk> or <properties><android.sdk.path>...</android.sdk.path></properties> or on command-line using -Dandroid.sdk.path=... or by setting environment variable ANDROID_HOME 

 pom.xml에 직접 ANDROID_HOME을 지정해 주면 됩니다.

<properties>
  	<android.sdk.path>/your/sdk/path</android.sdk.path>
</properties>


TableView에서 Pull Down Refresh(끌어 당겨 새로고침) 구현하기

Published on: 2011. 11. 24. 19:11 by louis.dev

UITableView를 사용해서 데이터를 로딩할 때 버튼을 둬서 리프레시를 할 수도 있지만, twitter나 facebook앱 처럼 TableView를 아래로 당기면 리프레시가 되는 TableView를 구현해 보려고 한다.
[Pull Down Refresh를 구현 한 예]

이 refresh를 처음부터 구현을 하려면 많이 힘들겠지만 다행이도 다른 개발자가 라이브러리 화 시켜놓은 라이브러리가 있으며, 이 라이브러리를 통해 쉽게 구현할 수 있다.
해당 라이브러리는 여기에서 다운로드 할 수가 있다. 

xCode 4.2버전을 통해 프로젝트를 진행해보도록 하겠다.(스토리보드로 UI를 꾸며 보겠다.)

1. 프로젝트를 생성한 후(스토리보드 사용에 체크를 하고) "library"라는 이름과 "images"라는 이름으로 그룹을 만든다.
 

 2. 위의 링크에서 다운로드 받은 파일 중 PullRefreshTableViewController.h, PullRefreshTableViewController.m 그리고 arrow.png 이미지를 추가 한다.
 
3. 해당 라이브러리를 사용하기 위한 Quartz.Core 프레임웍을 추가 한다.

4. PullRefreshTableViewController를 상속받은 MainTableViewController를 생성한다.

5.story board를 오픈한 후 초기에 생성되어있는 ViewController를 삭제 한 후 TableViewController를 끌어다 올려 놓는다.그리고 해당 TableViewController의 클래스를 위의 3단계에서 만든 MainTableViewController로 지정한다.

6. MainTableViewController.h에 tableView에서 데이터를 담을 NSArray형 변수를 하나 생성한다. 그리고 m파일에서는 UITableView를 사용하기위한 method를 구현해 준다.
 
 
7. 이후에 iOS시뮬레이터를 실행시키고 데이블을 당기면 다음과 같이 refresh가 되는 화면을 볼수가 있다.

이렇게 tableView를 당기면 라이브러리로 추가 했던 PullRefreshTableViewController의 method중 refresh라는 메소드가 호출이 된다. 그렇기 때문에 우리가 새로 만든 MainTableViewController에서 해당 method를 override해주어 개발하고자 하는 내용을 추가 해주면 된다.

 위 코드에서도 볼수 있듯이 데이터로딩이라던가 필요한 로직이 끝나면 PullRefreshTableViewController에 있는 method인 stopLoading이라는 메소드를 호출하여 loading....이라는 메세지를 숨겨 주면 된다.

이상으로 쉽게 PullDownRefresh를 구현하는 방법을 알아 보았다 

ActionSheet 위에 PickerView + Toolbar 올리기

Published on: 2011. 11. 20. 00:28 by louis.dev

메인 화면에서 버튼을 클릭하면 PickerView를 포함한 ActionSheet를 보여주는 것을 진행해 보겠다.

1. 다음과 같은 화면으로 xib를 생성합니다.
 2. IBOutlet과 결과 레이블을 연결하고 버튼 클릭시 수행할 method를 IBAction을 통해 선언한다. 그리고 PickerView를 사용하기 위한 UIPickerViewDelegate, UIPickerViewDataSource를 선언한다.
 
3. 필요할 delegate method를 구현하고 PickerView에 들어갈 데이터를 초기화 한다.
 
4. 버튼클릭시 실행 될 method에서 ActionSheet에 PickerView와 Toolbar를 올리는 코드를 작성한다. 또한 Toolbar 버튼 클릭시 실행될 method들을 구현한다.
 

 [실행결과]

UITableView - 10. CustomCell에서 셀 안의 버튼 이벤트 처리하기

Published on: 2011. 11. 19. 17:37 by louis.dev

이전의 포스팅에서 IB를 이용하여 Custom Cell을 만드는 법에 대해서 알아보았다. 이때 셀 가장 오른쪽에 만든 오른쪽 버튼이 클릭 되었을때 delegate를 통해 처리해 보자.
버튼 클릭시 일어나는 이벤트 처리 method를 protocol로 만들어 두고 이 protocol을 구현하도록 하여 delegate처리를 하면 된다. 

1. cell의 클릭 이벤트를 처리할 protocol을 만든다.
 itemId는 현재 클릭한 cell의 index를 저장한다.


2. 버튼클릭시 발생하는 -(IBAction)addCart: 에서 method실행시 등록된 delegate로 이전하는 코드를 작성한다.

4. ViewController.h에 만든 delegate를 등록하고 cell을 생성할 때 delegate와 itemId를 지정해 준다. 그리고 delegate method를 구현한다.