태그 보관물: Android

안드로이드 프로젝트 빌드 유지(CI)를 위한 팀시티(TeamCity) 설치

이 글은 안드로이드 프로젝트의 빌드를 유지하는 세 개의 글 중에 첫 번째이다.

팀시티(TeamCity)는 JetBrain에서 개발한 지속 통합(CI, Continuous Integration)을 지원하는 툴이다. 지속 통합 툴로 유명한 것으로는 Jenkins, Travis, 그리고 Cruise Control등이 있다. 지속 통합에 대한 개념은 아래의 링크에서 확인해 보자.
https://en.wikipedia.org/wiki/Continuous_integration
http://happystory.tistory.com/89

팀시티는 기본 무료로 사용할 수 있지만, 프로젝트 개수와 볼륨의 크기에 따라 상업용으로 구매해야 할 수도 있다. 라이선스에 대한 내용은 라이선스 페이지 에서 확인할 수 있고, 현재는 아래의 사용까지는 무료로 사용할 수 있다.

20 build configurations
3 build agents

이 정도면 작은 기업에서는 구입하지 않아도 충분히 사용할 수 있을 것이다. 이제 팀시티를 설치하고, 소스 저장소에 있는 안드로이드 앱을 연결해서 지속 통합을 하는데 필요한 환경을 설치하는 방법을 살펴보자. 아래 내용은 안드로이드 개발환경이 없는 윈도 서버(2012)에 설치하는 것을 가정한다.

1. 자바, 안드로이드 SDK 설치

팀시티로 안드로이드 앱을 빌드하는데는 자바와 안드로이드 SDK가 필요하고, 자바와 안드로이드 SDK를 설치하는 것을 살펴보자.

1.1 자바 설치

자바는 오라클 자바 사이트에서 내려받아 설치한다. 설치한 후에 “내 PC > 속성(R) > 고급 시스템 설정 > 고급 > 환경 변수 > 시스템 변수”에 JAVA_HOME을 추가한다.

1.2 안드로이드 SDK 설치

안드로이드 SDK는 안드로이드 앱을 개발/빌드/실행 하는데 필요한 라이브러리, 툴, 에뮬레이터 환경을 가지고 있다. 이 툴은 개발툴 다운로드 페이지에서 내려받을 수 있고, 이 페이지 아래에 “Get just the command line tools”의 하위에 SDK만을 별로도 다운로드 받을 수 있게 분리되어 있다.

여기에서는 윈도 2012 서버에 android-sdk_r24.4.1-windows.zip 파일을 다운로드 받아서 C:\Dev\android-sdk에 압축을 풀어서 저장하고 사용한다. SDK가 준비되면, “내 PC > 속성(R) > 고급 시스템 설정 > 고급 > 환경 변수 > 시스템 변수”에 ANDROID_HOME 변수를 추가하고 SDK 위치를 설정한다. 아래 이미지에 자바와 안드로이드 SDK가 설정된 것을 볼 수 있다.

system_variable_settings

SDK 설치를 완료하면, SDK 매니저(Manager)를 실행해서 필요한 툴, 플랫폼, 저장소 소스등을 내려받는다. 아래 이미지는 SDK 매니저를 실행해서 필요한 툴, 플랫폼(화면은 없지만, 앱에서 사용하는 플랫폼은 선택해야 한다), 그리고 라이브러리 및 툴등을 선택한 화면이다.

sdk_image_01

위 이미지는 필요한 빌드툴을 선택해서 설치하는 화면이다.

sdk_image_02

위 이미지는 필요한 라이브러리등을 선택한 화면이다.

SDK 매니저를 사용해서 필요한 것들의 설치를 완료하면 팀시티를 사용해서 빌드할 수 있는 기본 환경 구성을 완료한 것이다.

2. 팀시티(TeamCity) 설치

팀시티는 팀시티 웹 사이트에서 다운로드 메뉴를 클릭해서 내려받고 설치한다. 여기에서 사용하는 버전 정보는 다음과 같다.

Version : 10.0.2
Build: 42234
Released: September 19, 2016

이제 팀시티를 설치해 보자. 아래에 설치하면서 필요한 설정이 있는 부분들을 기준으로 살펴본다.

2.1 다운로드 받은 파일을 실행하고, 설치 위치를 확인한다.

아래의 왼쪽 이미지가 설치를 시작하는 화면이고, 오른쪽 화면이 설치 위치(C:\TeamCity)를 설정하는 화면이다.
teamcity_install_01 teamcity_install_02

2.2 웹 서비스를 위한 서버의 포트를 설정하고, 각종 설정을 확인한다.

왼쪽 화면이 팀시티가 실행하면서 접속하는 웹 서비스 포트를 설정하는 화면이고, 오른쪽은 설정된 값들을 확인하고 추가할 수 있는 화면이다.

teamcity_install_03 teamcity_install_04

2.3 팀시티의 시작 계정을 설정한다.

이 단계에서는 팀시티를 구성하는 서버/에이전트를 런칭하는 계정을 설정하고, 서비스를 시작하도록 설정한다. 아래 화면을 보면 시스템 계정으로 시작시키는 것을 알 수 있다. 시스템 계정으로 시작시키기에 위에서 설정한 JAVA_HOME과 ANDROID_HOME을 내 계정이 아닌 시스템으로 설정한 이유이기도 하다.

teamcity_install_05 teamcity_install_06 teamcity_install_07

2.4 팀시티 웹 서비스에 연결해서 필요한 설정을 추가한다.

teamcity_install_08 teamcity_install_09

위 화면은 팀시티 설치를 완료하고, 팀시티 웹서비스에 연결해서 필요한 설정을 시작하는 화면이다. 오른쪽 화면에서 팀시티의 데이터를 저장하는 위치를 설정한다. 기본으로 C:\ProgramData 폴더가 지정되어 있는데, 이 폴더는 윈도에서 앱들의 데이터 저장 위치로, 기본 설정이 숨김폴더이다. 그래서 저장하는 데이터를 쉽게 확인할 수 있게 저장 위치를 C:\TeamCityData로 변경한다.
teamcity_install_10

위 화면은 팀시티가 사용할 데이터베이스를 선택하는 화면이다. 데이터베이스로 Internal(HSQLDB), PostgreSQL, MySQL, Oracle, MS SQL Server를 지원한다. 여기에서는 프로젝트가 많지 않아서, Internal(HSQLDB)을 선택한다.

teamcity_install_11 teamcity_install_12

다음은 라이선스 동의 화면으로, “Accept license agreement”는 선택해야 하고, “Send anonymous usage statistics to TeamCity development team”은 옵션이라서, 선택을 해제한다. 그리고 우측의 화면에서 관리자 계정을 생성한다.

teamcity_install_13

이 화면은 관리자 계정을 생성한 후에, 로그인된 화면이다.

이제 팀시티 설치가 마무리 되었다. 다음 포스트에서 팀시티로 안드로이드 앱을 지속적으로 빌드하는데 필요한 설정을 살펴보겠다.

Remix OS for PC 베타 설치 & Play 스토어 앱 설치

Remix OS는 Jide라는 회사에서 개발하고 있는 또 다른 안드로이드 OS이다. 이 OS는 인텔 칩을 사용하는 기존의 PC에서 안드로이드 앱을 사용할 수 있도록 지원하고 있다. 웹 사이트(http://www.jide.com)에서 보면 알 수 있지만, 안드로이드 X86의 최대 오픈 소스 커뮤니티인 Android-x86(http://www.android-x86.org)과 파트너 쉽을 맺고 있는 것을 볼 수 있다. 그리고 Android-x86 사이트에서도 Remix OS와 파트너 쉽을 맺고 있다는 것을 알리고 있다.

개인적으로 Android-x86을 몇 번 설치해서 사용해 봤지만, 홀로 테마와 비율에 맞지 않는 앱들(창 조절 안 되는 문제)로 인해서 사용하기 불편했었다. 하지만 Remix OS에서는 이런 불편한 점들을 개선해서 안드로이드 OS도 데스크톱에서 쉽고 편하게 사용할 가능성을 제공하게 되었다.
Remix OS의 성능은 웹 사이트(http://www.jide.com/en/remixos-for-pc)에서 확인할 수 있다. 이제 Remix OS 설치와 Play 스토어 앱을 설치해 보자.

1. Remix OS 다운로드
Remix OS는 http://www.jide.com/en/remixos-for-pc#downloadNow 에서 사용자 환경에 맞게 다운로드를 하면 된다. 필자의 경우에는 32bit 랩톱에 설치할 예정이라 “32-bit Legacy BIOS only” 버전을 다운로드 받아서 설치한다. 설치하는 환경은 HP EliteBook 8440P의 랩톱이고, 윈도 10이 설치되어 있다.

remix_os_download
그림 1.1 다운로드 받은 Remix OS 베타 버전의 파일들

위 파일에서 Remix OS Installation Tool.exe를 사용해서 USB로 부팅해서 OS를 설치할 수 있도록 설치를 한다. 그리고 “How to Launch Remix OS for PC.txt” 파일은 설치하는 과정을 설명하는 파일이다.

remix_usb_install
그림 1.2 USB에 Remix OS 설치 화면

위 화면은 USB에 Remix OS를 설치하는데 필요한 ISO 이미지 설정, Type으로 USB Drive, 그리고 Drive의 위치를 선택해서 OK 버튼을 클릭하면 USB에 OS 설치를 완료한다.

2. Remix OS 설치
이제 컴퓨터에 설치해 보자. 설치하는 컴퓨터의 CMOS에서 USB 부팅 우선순위를 하드보다 높힌다음 계속 진행한다.
이제 아래와 같은 화면을 보게된다.

remix_os_install
그림 2.1 설치 화면

위 그림 2.1과 같은 화면이 나오면 하드 디스크에 설치(Resident mode) 또는 Usb Live 모드(Guest mode)로 설치할 수 있다. 필자는 하드 디스크에 설치했다. 이제 설치를 다 하고 부팅을 하면 아래와 같은 화면을 볼 수 있다.

remix_os_select_os
그림 2.2 Remix OS가 추가된 부팅 화면

그림 2.2에서 보듯이, Remix OS가 하드에 설치되어 부트 로더에 등록된 모습을 볼 수 있다. 이제 부팅을 하면서 Remix OS를 선택해서 사용할 수 있는 환경이 되었다.

3. Play 스토어 앱 설치
커스텀 안드로이드 OS를 사용하게 되면 늘 불편한 점이 Play 서비스와 Play 스토어 앱이 설치되어 있지 않다는 것이다. Remix OS에 Play 서비스와 Play 스토어 앱을 설치하는 방법은 Remix OS의 구글 그룹에서 확인할 수 있다. 이 그룹에서 “How to download and install Google Play Store on Remix OS for PC(https://groups.google.com/forum/#!topic/remix-os-for-pc/6jsV0ZB8174)”를 확인해 보면 구글 Play 서비스와 Play 스토어 앱을 설치해 주는 앱(GMSActivator.apk)을 다운로드 해서 설치하고 실행한다.

이 파일을 설치하기 전에 설정 > 보안 > 에서 “알 수 없는 소스”를 선택해야 한다. 그래야 로컬에 다운로드 받은 apk 파일을 설치할 수 잇다.

Screenshot_2016-03-02-04-16-50
그림 3-1, 설정 > 보안  화면

편의를 위해서 이곳에 업로드 해 놨으니 다운로드 받으면 된다. 그리고 이 파일을 압축해제하면 GMSActivator.apk 파일을 보게되고, 이 파일을 설치한다.

GMSActivator.zip

이 앱을 설치하고, 실행하면 아래와 같은 화면을 보게된다.

Screenshot_2016-03-02-04-15-58
그림 3-2, GMSActivator.apk 실행 화면

그림 3-2에서 “INSTALL GOOGLE SERVICES” 버튼을 클릭하면, 필요한 파일을 다운로드 받으면서 설치가 완료한다. 그리고, 부팅을 다시 한번 한다. 이 과정으로 Remix OS를 설치하고 Play 스토어 앱을 설치해서 데스크톱의 환경에서 편리하게 안드로이드 OS를 사용할 수 있게 된다.

Screenshot_2016-03-02-04-15-05

그림 3-3, Remix OS에서 Play 스토어 앱을 실행한 화면 및 설치된 앱들

안드로이드 공유 인텐트(Share Intent) 목록 필터링 하기

안드로이드 앱에서 데이터를 공유(Share)하는데, 이 데이터를 받아주는 써드 파티 앱을 실행하는 데는 인텐트(Intent)를 사용한다. 그리고 텍스트 데이터를 공유하는 데 사용하는 코드는 아래와 같다. 아래의 2번째 줄이 공유하는 데이터의 MimeType이다.

Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("text/plain");

실제로 위 인텐트를 사용해서 텍스트 데이터를 공유하는 예제를 살펴보면 다음과 같다.

String subject = "메시지 제목";
String text = "메시지 내용은\n다음줄에서..";

Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, text);
Intent chooser = Intent.createChooser(intent, "타이틀");
startActivity(chooser);

이 예제코드를 사용해서 텍스트를 공유하는데, 이 데이터를 받아주는 앱들을 안드로이드 운영체제에 요청하면 아래와 같은 결과를 보게 된다.

Screenshot_2015-12-23-23-46-06

이 화면을 보면, 개발자가 텍스트를 공유하기 원하는 안드로이드 앱(종종 SNS 서비스 만을 보여주길 원한다)을 선택하기에 너무나 많은 앱을 보게 된다. 그래서 데이터를 공유하는데, 보이기 원하는 앱만을 필터링해서 보여주는 방법을 살펴보자.

여기에서 사용하는 방법은 패키지 매니저를 사용해서 데이터를 공유하는 인텐트를 처리할 수 있는 액티비티 정보를 가져오고, 이 정보를 사용해서 앱 이름 또는 패키지 이름으로 필요한 앱만 화면에 보이게 한다.

아래는 화면에 보이기 원하는 앱 이름 또는 패키지 이름으로 보이도록, 원하는 인텐트를 필터링 하는 예제이다.

/**
 *
 * @param name 패키지나 앱 이름
 * @param subject 제목
 * @param text 내용
 *
 * @return
 */
private Intent getShareIntent(String name, String subject, String text) {
    boolean found = false;

    Intent intent = new Intent(android.content.Intent.ACTION_SEND);
    intent.setType("text/plain");

    // gets the list of intents that can be loaded. 
    List<ResolveInfo> resInfos = getPackageManager().queryIntentActivities(intent, 0);

    if(resInfos == null || resInfos.size == 0)
        return null;

    for (ResolveInfo info : resInfo) {
        if (info.activityInfo.packageName.toLowerCase().contains(name) ||
                info.activityInfo.name.toLowerCase().contains(name) ) {
            intent.putExtra(Intent.EXTRA_SUBJECT, subject);
            intent.putExtra(Intent.EXTRA_TEXT, text);
            intent.setPackage(info.activityInfo.packageName);
            found = true;
            break;
        }
    }

    if (found)
        return intent;

    return null;
}

이제 위에서 살펴본 메서드를 사용해서 원하는 앱을 보여주기 위한 코드를 살펴보자. 아래의 코드를 살펴보면, “facebook”, “twitter”, “com.google.android.apps.plus”, 그리고 “gmail”로 필터링해서 targetedShareIntents에 인텐트 목록을 저장해서, 이 목록에 있는 인텐트 앱을 화면에 보여준다.

String subject = "메시지 제목";
String text = "메시지 내용은\n다음줄에서..";

List targetedShareIntents = new ArrayList<>();

// 페이스북
Intent facebookIntent = getShareIntent("facebook", subject, text);
if(facebookIntent != null)
    targetedShareIntents.add(facebookIntent);

// 트위터
Intent twitterIntent = getShareIntent("twitter", subject, text);
if(twitterIntent != null)
    targetedShareIntents.add(twitterIntent);

// 구글 플러스
Intent googlePlusIntent = getShareIntent("com.google.android.apps.plus", subject, text);
if(googlePlusIntent != null)
    targetedShareIntents.add(googlePlusIntent);

// Gmail
Intent gmailIntent = getShareIntent("gmail", subject, text);
if(gmailIntent != null)
    targetedShareIntents.add(gmailIntent);

Intent chooser = Intent.createChooser(targetedShareIntents.remove(0), "타이틀");
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
startActivity(chooser);

자 이제 화면을 살펴보자.

Screenshot_2015-12-23-23-47-01

이제 앱에서 데이터를 전송하기 원하는 앱을 몇 개만 보게된다. 그래서 Tell a Friend와 같은 메뉴가 있다면 SNS 카테고리에 해당하는 앱만을 보여줄 수 있고, MimeType이 이미지인 경우에도 클라우드 서비스(Gdrive, Dropbox, Onedrive, Box 등)만을 데이터 공유에 사용할 수 있다.

이 방식의 단점은 아무래도 필터링을 해야 하니, 반응이 약간 느리다. 이 단점은 미리 캐시해서 해결할 수도 있다.

* Reference

– http://stackoverflow.com/questions/13286358/sharing-to-facebook-twitter-via-share-intent-android

v7 Support Preference 라이브러리 사용하기

구글의 안드로이드는 매년 새로운 버전이 나오면서 새로운 기능을 제공하는 API를 발표한다. 새로운 버전이다 보니 이전의 버전에서 새로운 기능 또는 UI 등을 사용하기 힘든 상황이다. 그래서 구글은 Android Support 라이브러리(Support 라이브러리)들을 제공해서 하위 버전에서도 상위 버전의 기능과 UI를 사용할 수 있게 지원한다. 그래서 안드로이드 개발자들은 기본 API와 더불어 Support 라이브러리를 살펴봐야 하는 이중고(?)를 겪게 있다. 이 글에서는 Support 라이브러리 중의 하나인 v7 버전의 preference 라이브러리를 사용하는 방법과 약간의 팁을 살펴보자.

preference_01
그림 1, Android SDK Manager 툴 일부

그림 1에서 Android Support Library는 23.1.1 버전이 설치된 것을 확인할 수 있다. 그래서 Support 라이브러리 버전은 v4든 v7이든 23.1.1 버전을 사용한다는 것도 알 수 있다. 이 라이브러리는 %android_home%\extras\android\support 폴더에서 확인할 수 있다.

1. 환경설정

그래들(Gradle) 빌드 파일(Build.gradle)에 아래와 같은 의존 라이브러리가 필요하다.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.android.support:recyclerview-v7:23.1.1'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:preference-v7:23.1.1'
}

2. Preference xml 파일 추가

안드로이드에서 설정 화면 역시 xml 파일로 구성한다. 다른 UI와 다르게 목록의 형태로만 구성할 수 있도록 되어 있다. 기존의 Preference는 내부에서 ListView를 사용하고 있지만, v7의 경우에는 RecyclerView를 사용한다. 그래서 그래들 빌드 파일의 의존성에 v7의 다른 라이브러리가 필요한 것이다. 그리고 아래와 같은 설정 파일은 app/res/xml/ 아래에 위치해야 한다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <android.support.v7.preference.PreferenceCategory android:title="카테고리1">
        <android.support.v7.preference.SwitchPreferenceCompat
            android:key="pf_folder_display_option"
            android:icon="@mipmap/ic_launcher"
            android:title="카테 타이틀 01"
            android:summary="summary"
            android:defaultValue="false" />

        <android.support.v7.preference.SwitchPreferenceCompat
            android:icon="@mipmap/ic_launcher"
            android:title="카테 타이틀 02"
            android:summary="summary"
            android:defaultValue="false" />

        <android.support.v7.preference.SwitchPreferenceCompat
            android:icon="@mipmap/ic_launcher"
            android:title="summary"
            android:summary="summary"
            android:defaultValue="true" />
    </android.support.v7.preference.PreferenceCategory>

    <android.support.v7.preference.PreferenceCategory android:title="카테고리2">
        <android.support.v7.preference.SwitchPreferenceCompat
            android:title="SwitchPreferenceCompat 타이틀"
            android:summary="SwitchPreferenceCompat Summary"
            android:icon="@mipmap/ic_launcher"
            android:defaultValue="true" />
    </android.support.v7.preference.PreferenceCategory>

    <android.support.v7.preference.PreferenceCategory android:title="카테고리3">
        <android.support.v7.preference.Preference
            android:title="타이틀 02"
            android:summary="Summary"
            />

        <android.support.v7.preference.Preference
            android:title="타이틀 03"
            android:summary="Summary"
            />

        <android.support.v7.preference.Preference
            android:title="@string/app_name"
            android:summary="Summary"
            />
    </android.support.v7.preference.PreferenceCategory>
</android.support.v7.preference.PreferenceScreen>

3. 액티비티(Activiy) 예제

예제 프로젝트의 SettingsActivity.java 소스는 아래와 같다. 이 소스는 간단하게 아래의 PreferenceFragmentCompat을 상속해서 구현하고 있는 클래스로 화면을 구성하는 소스이다.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment(), null).commit();
    }
}

4. SettingsFragment 예제

이 클래스는 PreferenceFragmentCompat를 상속해서 실제 Preference 화면을 구성하는 xml을 로딩하는 소스이다. 기존에 사용하던 PreferenceFragment에서는 onCreate() 메서드에서 xml을 로딩했지만, PreferenceFragmentCompat 에서는 onCreatePreferences() 메서드를 사용한다.

import android.os.Bundle;
import android.support.v7.preference.PreferenceFragmentCompat;

public class SettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        addPreferencesFromResource(R.xml.settings);
    }
}

5. 스타일(styles.xml) 추가

위 과정이 끝나면 테마에 preference 테마를 추가할 필요가 있다. 아래의 수정된 styles.xml 에서 AppTheme의 preferenceTheme 요소의 값으로 @style/PreferenceThemeOverlay를 사용하고 있는 것을 알 수 있다.

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="preferenceTheme">@style/PreferenceLocalTheme</item>
    </style>
    <style name="PreferenceLocalTheme" parent="@style/PreferenceThemeOverlay" />
</resources>

이제 위 과정의 결과로 아래와 같은 멋진(?) 화면을 확인할 수 있다.

preference_02
그림 2, v7 Preference 라이브러리를 사용한 설정 화면

그림 2를 살펴보면, 롤리팝의 머터리얼 디자인 테마와 홀로 테마가 섞여 있다는 것을 알 수 있다. 그래서 조금 더 머터리얼 디자인의 모습을 가지도록 UI를 변경해 보자.

6. 스타일(style.xml) 변경

위 결과 화면을 보면, v7 Preference 기본 UI가 머터리얼(Material) 디자인이라고 보기에는 구리다. 그래서 스타일을 변경해서 UI를 개선하는 방법을 살펴보자.

6.1 android.support.v7.preference.PreferenceCategory의 Text 스타일 변경

아래와 같이 PreferenceCategory에 보여지는 TextView의 스타일을 변경한다.

<style name="ListSeparatorTextView">
  <item name="android:textSize">16sp</item>
  <!--item name="android:textStyle">bold</item-->
  <item name="android:textColor">@color/accent</item>
  <item name="android:paddingTop">16dp</item>
  <item name="android:layout_marginBottom">16dp</item>
</style>

6.2 Preference의 Title과 Summary 스타일 변경

이 Preference의 Title은 textAppearanceLarge를 style로 사용하고 있고, Summary는 textAppearanceMedium을 style로 사용하고 있다. 그래서 위 설정화면의 Title과 Summary가 크게 느껴진다. 그래서 이 두개의 스타일을 변경해 보자.

<style name="LargeText">
   <item name="android:textSize">16sp</item>
</style>
<style name="MediumText">
   <item name="android:textSize">11sp</item>
   <item name="android:typeface">sans</item>
</style>

위 과정으로 변경된 전체 styles.xml은 아래와 같다.

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="preferenceTheme">@style/PreferenceLocalTheme</item>
    </style>

    <style name="AppThemePreference" parent="AppTheme">
        <item name="android:listSeparatorTextViewStyle">@style/ListSeparatorTextView</item>
        <item name="android:textAppearanceLarge">@style/LargeText</item>
        <item name="android:textAppearanceMedium">@style/MediumText</item>
    </style>

    <style name="PreferenceLocalTheme" parent="@style/PreferenceThemeOverlay" />

    <style name="ListSeparatorTextView">
        <item name="android:textSize">16sp</item>
        <!--item name="android:textStyle">bold</item-->
        <item name="android:textColor">@color/colorPrimary</item>
        <item name="android:paddingTop">16dp</item>
        <item name="android:layout_marginBottom">16dp</item>
    </style>

    <style name="LargeText">
        <item name="android:textSize">16sp</item>
    </style>

    <style name="MediumText">
        <item name="android:textSize">11sp</item>
        <item name="android:typeface">sans</item>
    </style>

</resources>

위 스타일로 변경된 스타일의 화면은 다음과 같다.
preference_03

위 스타일에서 설정을 가지고 있는 액티비티는 AppThemePreference를 테마로 사용하면 된다. 이 테마안에 보면 android:textAppearanceLarge나 android:textAppearanceMedium이 테마 전역으로 사용하는 요소이기 때문에 이 테마를 사용하는데는 주의를 해야 한다.

안드로이드 앱 개발 동영상 강좌

안드로이드 스튜디오로 안드로이드를 개발하는 동영상 강좌이고, 제목은 “Android Apps Development Tutorial for Beginners” 이다. 이 강좌는 안드로이드 스튜디오 설치부터 시작해서, 안드로이드 구성요소들의 사용방법, 그리고 libGDX를 사용해서 아주 간단한 게임을 만드는 내용으로 구성되어 있다. 유투브에 있는 안드로이드 강좌 중에 가장 훌륭한 퀄리티를 보여준다. 단점으로는 영어로 설명한다는 것이지만 영어도 같이 공부할 겸 보면 아주 유익한 시간이 될 것 같다.

아래는 개별 강좌이다.

Android Apps Development Tutorial for Beginners (1)

Android Apps Development Tutorial for Beginners (2)

Android Apps Development Tutorial for Beginners (3)

Android Apps Development Tutorial for Beginners (4)

Android Apps Development Tutorial for Beginners (5)

Android Apps Development Tutorial for Beginners (6)