반응형

안드로이드 개발을 하다 보면 버튼의 음영 효과가 적용되어 있는 것을 확인할 수 있다. 

 

음영 효과 제거 방법에는 2가지가 있다. 

 

xml상에서 옵션을 추가 하거나 소스상에서 옵션을 추가하는 방식이 있다. 

 

음영 효과 제거

1. xml

<androidx.appcompat.widget.AppCompatButton
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:stateListAnimator="@null"
    android:text="@string/next"/>

2. 소스

binding.mButtonNext.stateListAnimator = null

 

결과

  1. 음영 효과 옵션 추가 전
  2. 음영 효과 옵션 추가 후
728x90
반응형
반응형
 

[Android] Google Maps API - 사용하기 1

안드로이드에서 구글맵을 사용하기 위해서는 Google Maps API에 등록을 해야 합니다. 우선 구글맵 사용하기 전에 Google Maps API를 등록하는 방법부터 확인해보겠습니다. 목차 프로젝트 만들기 API 라이

blacktrees.tistory.com

 

안드로이드에서 구글맵을 사용하기 위해서는 Google Maps API에 등록한 API 키를 프로젝트에 적용해보겠습니다.

 

목차

  1. 프로젝트에 키 등록
  2. 레이아웃에 View 적용
  3. View 선언하여 사용

 

1) 프로젝트에 키 등록

  1. app build.gradle에 Google Play Services 라이브러리를 추가해준다.
  2. 추가해 준 후 , Sync Now를 선택한다.
  3. AndroidManifest에 아래와 같이 등록해준다.

build.gradle

implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.android.gms:play-services-location:18.0.0'

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.test">

    <application
     ...>

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="API키" />

        <activity
            ...>
        </activity>
    </application>
</manifest>

2) 레이아웃에 View 적용

  1. map view를 적용할 레이아웃에 아래와 같이 적용한다.
<fragment android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.google.android.gms.maps.SupportMapFragment"/>

 3) View 선언하여 사용

  1. 아래와 같이 선언하여 사용한다.

activity

getSupportFragmentManager().findFragmentById(R.id.map).getMapAsync(this)

fragment

var smallMap : GoogleMap?= null
val fragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
fragment.getMapAsync(onSmallMapReadyCallback)
val onSmallMapReadyCallback =  object : OnMapReadyCallback {
    override fun onMapReady(googleMap: GoogleMap?) {
        smallMap = googleMap
        val location = getCurrentLocation()
        if (location != null){
            latLng = LatLng(location!!.latitude, location!!.longitude)
            val markerOptions = MarkerOptions()
            markerOptions.position(latLng)
            smallMap!!.addMarker(markerOptions)
            smallMap!!.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14f))
        }
    }
}

728x90
반응형
반응형

안드로이드에서 구글맵을 사용하기 위해서는 Google Maps API에 등록을 해야 합니다.

우선 구글맵 사용하기 전에 Google Maps API를 등록하는 방법부터 확인해보겠습니다.

 

목차

  1. 프로젝트 만들기
  2. API 라이브러리 활성화
  3. API 키 생성

 

설명

1) 프로젝트 만들기

  1. Google Maps API를 사용하기 위해서는 구글 글라우드 콘솔 내에 프로젝트를 만들어야 한다.
  2. Google Developers Console 사이트에 접속하여 프로젝트를 만들어야 한다.
  3. https://console.developers.google.com/apis/dashboard 
  4. 프로젝트 선택 - 새 프로젝트를 선택한다.
  5. 프로젝트 이름을 만들고 '만들기'를 선택한다.
  6. 새로운 프로젝트가 생길 때가 기다리면 된다.

2) API 라이브러리 활성화

  1. 왼쪽 메뉴에서 라이브러리를 선택한다.
  2. 검색창에서 'Maps SDK for Android'를 검색하거나 아래의 보이는 항목 중에서 선택한다.
  3. '사용'을 선택한다.
  4. ' API 사용 설정됨'이라고 변경되면 Google Maps API가 정상적으로 활성화가 된 것이다.

3) API 키 생성

  1. 처음 화면에서 왼쪽 메뉴에서 '사용자 인증 정보'를 선택한다.
  2. 상단에 '+사용자 인증 정보 만들기'를 선택한다.
  3. 'API'키를 선택한다.
  4. 키가 생성이 되면 생성이 되었다고 팝업이 뜬다 그러면 'API 키를 수정'을 선택한다.
  5. 애플리케이션 제한사항에서 'Android 앱'을 선택한다.
  6. Android 앱의 사용량 제한에서 항목 추가를 선택한다.
  7. 패키지 이름과 SHA-1 인증서 디지털 지문을 등록한다.
  8. API 제한사항에서 키 제한을 선택한다.
  9. 'Maps SDK for Android'를 체크한다.
  10. 아래의 저장버튼을 누른다.
  11. 이때 받은 API 키를 Android 프로젝트에 사용하면  Google Maps API를 사용할 수 있다.

 

 

 

[Android] Google Maps API - 사용하기 2

[Android] Google Maps API - 사용하기 1 안드로이드에서 구글맵을 사용하기 위해서는 Google Maps API에 등록을 해야 합니다. 우선 구글맵 사용하기 전에 Google Maps API를 등록하는 방법부터 확인해보겠습니

blacktrees.tistory.com

 

728x90
반응형
반응형

개발을 하다 보면 시스템 설정이 아닌 앱 내에서 언어를 변경해야 하는 경우가 있다. 

전에는 적용하려면 리소스를 찾아서 적용해줘야 했는데 간단한 방법이 있어서 올립니다.

 

다른 언어 추가

  1. string.xml 파일 생성 : res - values-ko 또는 res - values-en
  2. string.xml에 String 값 만들어 준다.

 

언어 변경 

1. configuration에 원하는 언어의 Locale을 설정해줘서 createConfigurationContext()로 Context를 만든다.

public static Context updateResourcesLocale(Context context, Locale locale) {
   Configuration configuration = context.getResources().getConfiguration();
   configuration.setLocale(locale);
   return context.createConfigurationContext(configuration);
}

2. BaseActivity를 만들어서 attachBaseContext를 Override해서 new Context를 적용한다.

@Override
public void attachBaseContext(newBase context) {
	super.attachBaseContext(Utils.updateResourcesLocale(newBase, Locale.US))
}

 

 

728x90
반응형
반응형

오늘은 getContext와 requireContext 차이점에 대해서 알아보겠습니다. 

 

 

android 팀에서 support library 27.1.0.에 NonNull, Nullable를 SDK메서드 일부에 주석을 달았습니다. 

 

왜 주석을 달았을까요?

fragment가 attach 되지 않은 상태에서 getContext를 호출하면 null을 반환합니다. 

예를 들어 Thread나 Runnable등을 사용시 fragment가 attach된 상태라는 것을 보장할 수 없는 경우가 발생합니다.

이경우 잠정적으로 NullPointerException이 발생할 수 있습니다. 

 

어떻게 수정해야 할까?

1. NonNull일때만 사용하는 경우 getContext에서 requireContext() 로 변경하여 사용해야 한다.

2. 호스트에 연결되지 않은 경우 requireContext()는 예외를 발생하니 fragment수명주기에 맞춰서 사용해야 한다.

 

기타 유사한 내용
1. getActivity 대 requireActivity
2. getHost 대 requireHost
3. getFragmentManager 대 requireFragmentManager

728x90
반응형
반응형

안드로이드 개발자 면접 때 나올만한 질문들을 정리해봤다. 

 

면접 질문

  1. Android 4대 컴포넌트 
    1. Activity
      1. 안드로이드에서 화면을 관리하고 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트
    2. Service
      1. 화면에 존재하지 않고 백그라운드에서 실행되는 컴포넌트
    3. Broadcast Receiver
      1. 특정 어플에서 발생하는 특정 브로드캐스트 메시지를 처리하는 컴포넌트
    4. Content Provider
      1. 앱 간 데이터 공유를 위한 클래스를 제공하는 컴포넌트
  2. Android Manifest
    1. 모든 앱 프로젝트에 반드시 있는 파일이며 애플리케이션의 정보들을 가지고 있다.
    2. 앱에 대한 필수적인 정보를 안드로이드 빌드 툴과 Android OS, 그리고 구글 플레이에 제공한다
  3. Activity, Fragment의 차이점
    1. Activity는 독립적으로 활용할 수 있다.
    2. Fragment는 Activity에 종속되어 있다.
    3. Activity는 전체 화면을 차지하고, Fragment는 전체 화면이 아닌 일부 화면으로 구성할 수도 있기 때문에 상대적으로 유연한 UI 디자인이 가능하다.
    4. Activity는 자동적으로 Stack에 넣어지고, Fragment는 Transaction을 통해서 요청해야 한다.
  4. Activity Life Cycle
    1. onCreate() : Activity 가 생성되면 가장 먼저 호출되는 callback 함수
    2. onStart() : Activity 가 사용자에게 보이기 직전에 호출되는 callback 함수
    3. onResume() :
      1. 사용자가 응용프로그램과 상호 작용을 할 수 있는 상태에 호출되는 함수
      2. 사용자가 응용프로그램을 사용할 수 있는 상태를 의미
    4. onPause() :
      1. Activity 가 중지된 상태로 사용자로부터 어떠한 입력도 받을 수 없고 어떤 코드도 실행할 수 없는 상태
      2. 다른 Activity 가 실행되어 Activity Stack의 최상단으로 올라가는 경우 호출
    5. onStop() : Activity 가 더 이상 보이지 않는 경우 호출
    6. onRestart() : Activity 가 onStop() 이 호출된 이후에 재시작되는 경우 호출되는 함수
    7. onDestroy() : 시스템이 Activity를 종료하기 직전에 호출되는 callback 함수
  5. Fragment Life Cycle
    1.  onAttach() : 이름처럼 액티비티에 프래그먼트가 attach 할 때 호출됩니다. 
    2. onCreate() :
      1. 프래그먼트를 생성할 때, 시스템에서 호출됩니다.
      2. Fragment View가 생성되지 않아서 Fragment의 View작업을 하기 적절하지 않습니다.
    3. onCreateView() : 프래그먼트에서 UI를 그릴 때 호출됩니다.
    4. onViewCreated() : onCreateView()를 통해 반환된 View는, onViewCreated()의 파라미터로 전달되는데, 이 시점부터 Fragment View의 라이프사이클이 INITIALIZED 된다.
    5.  onStart() : 이제 Fragment가 사용자에게 보일 수 있을 때 호출됩니다. Activity의 onStart()와 유사합니다.
    6.  onResume() :
      1. Fragment의 모든 애니메이션과 Transition 효과가 종료되고, 프래그먼트가 사용자와 상호작용이 가능할 때, onResume()이 호출됩니다.
      2. 이제 사용자와 프래그먼트가 상호작용할 준비가 되었다는 뜻인데, 반대로 말하면 onResume()이 실행되기 전에 사용자와 인터렉션 하는 것은 부적절합니다.
    7. onPause() : 시스템이 사용자가 프래그먼트를 떠나는 것을 감지하는 것입니다.
    8. onStop(), onSaveInstanceState() : 프래그먼트가 화면에 보이지 않을 때가 되면 onStop()이 호출됩니다. 
      1. API28 버전을 전후로
        1.  전 : onSaveInstanceState() -> onStop()
        2. 후 : onStop() -> onSaveInstanceState()
    9. onDestroyView() :
      1. Fragment가 화면으로 벗어나면 onDestroyView()가 실행됩니다.
      2. 해당 시점부터는 Fragment View에 대한 모든 참조가 제거돼야 합니다.
    10. onDestroy()
      1.  Fragment가 제거되면 호출됩니다. 
728x90
반응형
반응형

안드로이드 스튜디오 업데이트 후 기존 앱의 빌드 버전을 업하면서 아래와 같은 에러가 발생하였습니다.

원인

https가 아닌 http 주소로 통신하기 위해 선언해놓은 android:usesCleartextTraffic="true"로 발생하는 문제

 

해결 1

tools:replace="android:usesCleartextTraffic"

<application
    android:label="@string/app_name"
    android:usesCleartextTraffic="true"
    tools:replace="android:usesCleartextTraffic"
    >

해결 2

접근이 필요한 도메인만  정의해서 사용하기 

/res/xml/network_security_config.xml 파일을 만들어서 AndroidManifest에 추가 

<application
    android:label="@string/app_name"
    android:networkSecurityConfig="@xml/network_security_config"
    >
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">ip-api.com</domain>
    </domain-config>
</network-security-config>
728x90
반응형
반응형

안드로이드 스튜디오 업데이트 후 기존 앱의 빌드 버전을 업하면서 아래와 같은 에러가 발생하였습니다.

원인

"Failed to compile values file"라는 에러 이유는 에러가 사용자의 strings.xml 파일과 관련이 있다는 것이다.

해결

예를 들어

<string name="str_im">I\'m here!</string>

아래와 같이 수정해야 한다. 

<string name="str_im">I\'m here!</string>
728x90
반응형

+ Recent posts