오늘 포스팅은 안드로이드 퍼미션에 관한 내용이다.


안드로이드 마시멜로우 OS가 등장함에 따라,


기존 환경에서 바뀐점들이 있다. 

(https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html)


그 중, 제일 골치썩는 문제는 Runtime Permission이 아닐까 싶다.


아래의 글은 위 URL 에서 발췌한 내용중 하나이다.

Runtime Permissions


This release introduces a new permissions model, where users can now directly manage app permissions at runtime. This model gives users improved visibility and control over permissions, while streamlining the installation and auto-update processes for app developers. Users can grant or revoke permissions individually for installed apps.

On your apps that target Android 6.0 (API level 23) or higher, make sure to check for and request permissions at runtime. To determine if your app has been granted a permission, call the newcheckSelfPermission() method. To request a permission, call the new requestPermissions() method. Even if your app is not targeting Android 6.0 (API level 23), you should test your app under the new permissions model.

For details on supporting the new permissions model in your app, see Working with System Permissions. For tips on how to assess the impact on your app, see Permissions Best Practices.



간단하게 해석해보면, 


사용자가 접근 권한이 필요한 기능( 예를 들자면, 전화 바로 걸기)을 수행할때,


사용자로 하여금 해당 권한을 앱에 허락 할 것인지 묻고, 개발자가 아닌 사용자가 


자신의 디바이스의 접근 권한을 결정하는 방식이다.



이전 버전에서(API 22 이하 버전)의 접근 권한 수용방식은 앱을 설치할때,


사용자로 하여금 해당 권한을 사용한다는 것만 보여준다. 


즉, 앱을 설치하면 해당 권한등을 동의하는 것으로 간주된다.



API 22 아래 버전.


위 경우에서 개발자는 단순히 Manifest.xml에 권한 추가후 코딩하면 되겠지만,


아래와 같이 마시멜로우 버전에서의 런타임 퍼미션 체크방식 일 시, 코딩하기 녹록지 않다.


API 23 이상 버전.




하지만 모든 권한을 사용자로 하여금 확인받아야 하는 것은 아니다.


개인적인 생각이지만, 개인정보와 관련있는 권한은 확인 받지만


관련이 없는 권한은 확인을 안받아도 되는것 같다.


아래는 확인 받아야 할 권한 목록이다.



출처 : https://developer.android.com/guide/topics/security/permissions.html?hl=ko#normal-dangerous

Permission GroupPermissions
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE


지금부터 메시멜로우 os의 런타임 퍼미션을 위해 필요한 코딩등을 소개한다.

총 4가지의 메서드를 사용 할 것이다.

  • ContextCompat.checkSelfPermission()
  • ActivityCompat.shouldShowRequestPermissionRationale()
  • ActivityCompat.requestPermissions()
  • onRequestPermissionsResult()



첫번째 부터 세번째 까지의 메서드는 매개변수로 Context만 넣어줄 수 있다면, 어디서든 사용가능하다.


네번째 메서드는 Activity 안에서의 오버라이드 메서드 이다.


이름에서 볼 수 있다시피, 퍼미션 여부를 수행한 후 결과가 들어오는 곳이다.


아래의 예제를 보자.


1
2
3
4
5
6
7
8
/**
  해당 권한이 승낙 상태인지 거절 상태인지 확인한다.
*/
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED){
   //Manifest.permission.READ_CALENDAR이 접근 승낙 상태 일때
} else{
   //Manifest.permission.READ_CALENDAR이 접근 거절 상태 일때
}
cs


최초 앱 실행시, 당연히 접근 권한은 없으므로 else 블록을 타게 된다.


위 이미지에서 보는 것 처럼 권한 설정 요구 다이얼로그를 뜨게 하려면


아래 예시처럼 requestPermission() 메서드를 추가해야 한다.


1
2
3
4
5
6
7
8
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED){
   //Manifest.permission.READ_CALENDAR이 접근 승낙 상태 일때
} else{
   //Manifest.permission.READ_CALENDAR이 접근 거절 상태 일때
  
   //사용자에게 접근권한 설정을 요구하는 다이얼로그를 띄운다.
   ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CALENDAR},0);
}
cs


requestPermission 메서드는 매개변수로 Context, String 배열, int형 변수 를 원한다.


int형 변수는 후에 onRequestPermissionsResult() 메서드에 결과물이 전돨될 시,


결과물들을 구분 짓는 index 번호이다.


onActivityResult 메서드랑 똑같이 보면 될 것이다.




만약 사용자가 다이얼로그를 보고 승낙을 누른다면 좋겠지만,


만약 거절을 누른다면,


더 나아가 다시 보지 않기 체크 박스에 체크후 거절 버튼을 누른다면


상황은 복잡해진다.


그러한 상황을 캐치 하기 위해 ActivityCompat.shouldShowRequestPermissionRationale() 메서드를 써야한다.


해당 메서드를 쓰기 앞서 


사용자가 다이얼로그를 띄웠을 시, 할 수 있는 경우의 수를 계산 해보자.


1. 승낙하는 경우.


2. 거절하는 경우.


3. 다시 보기 않기 체크 후 거절 하는 경우.


이렇게 3가지 이다.


2번의 경우의 수인 그냥 거절 하는 경우, 후에 다시 앱을 킬때 


ActivityCompat.shouldShowRequestPermissionRationale() 메서드를 사용하면 true 가 리턴이 된다.


즉, 사용자가 거절한 이력이 있나 없나를 알 수 있는 메서드이다.  


이 메서드는 조심해서 써야한다. 


사용자가 최초 앱 접속시 뜨는 다이얼로그는 거절 이력이 없기때문에


ActivityCompat.shouldShowRequestPermissionRationale() 메서드를 사용시 false 가 리턴된다.


또한, 사용자가 3번 경우의 수를 선택 했을 경우도 마찬가지로  false가 리턴된다.


사용자가 3번 경우의 수를 선택 했을 경우는 후에 앱이 다시 켜질때,


requestPermission() 메서드를 쓰더라도 구글이 만든 권한 설정 요구 다이얼로그가 뜨질 않는다.


그 후, 곧바로 OnRequestPermissionResult 메서드가 실행된다.


따라서, 개발자 자체적으로 다이얼로그를 띄어 사용자가 직접 설정에 들어가 권한을 설정하게끔 유도를 해야한다.



아래는 ActivityCompat.shouldShowRequestPermissionRationale() 메서드를 추가한 예시이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED){
   //Manifest.permission.READ_CALENDAR이 접근 승낙 상태 일때
else{
   //Manifest.permission.READ_CALENDAR이 접근 거절 상태 일때
   if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_CALENDAR)){
      //사용자가 다시 보지 않기에 체크를 하지 않고, 권한 설정을 거절한 이력이 있는 경우
   } else{
      //사용자가 다시 보지 않기에 체크하고, 권한 설정을 거절한 이력이 있는 경우
   }
 
   //사용자에게 접근권한 설정을 요구하는 다이얼로그를 띄운다.
   //만약 사용자가 다시 보지 않기에 체크를 했을 경우엔 권한 설정 다이얼로그가 뜨지 않고,
   //곧바로 OnRequestPermissionResult가 실행된다.
   ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CALENDAR},0);
   
}
cs


최종 결과값은 OnRequestPermissionResult() 메서드로 받아야 한다.


아래의 코드는 예시이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResult){
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  //위 예시에서 requestPermission 메서드를 썼을시 , 마지막 매개변수에 0을 넣어 줬으므로, 매칭
  if(requestCode == 0){
     // requestPermission의 두번째 매개변수는 배열이므로 아이템이 여러개 있을 수 있기 때문에 결과를 배열로 받는다.
     // 해당 예시는 요청 퍼미션이 한개 이므로 i=0 만 호출한다.
     if(grantResult[0== 0){
        //해당 권한이 승낙된 경우.
     }else{
        //해당 권한이 거절된 경우.
     }
  }
}
cs


onRequestPermissionResult 메서드는 사용자가 무얼 선택하던, 무조건 타는 메서드 이다.


따라서 이 메서드를 통해 사용자가 권한을 거절했을 경우 대처해야한다.


필자는 복잡한 권한체크를 해야한다는 부담감과 설령 구현하더라도 해당 코드들이 난잡하게 섞이는게 싫어서, 


자체적으로 라이브러리를 만들었다.


손쉽게 권한체크를 하고싶은 독자들은 아래의 Github 주소를 참고 하길 바란다.


 

Github에서 Star를 눌러준다면, 더 좋은 오픈소스를 만들 수 있다.



  https://github.com/Mommoo/MommooPermission




포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅할 내용은 안드로이드 statusbar에


색상을 넣는 방법이다.


statusbar는 안드로이드 화면 최상단에 존재하며,


앱의 푸쉬나, 배터리 상태, 시간등을 알려주는 역할을 한다.


롤리팝 버전부터 toolbar ( 또는 actionBar )의 색상과 통일감을 주기 위해


statusBar의 색상을 바꿀 수 있도록 API 개편했다.


따라서 머터리얼 디자인을 준수한다면, statusbar 색상을 고려하지 않을 수 없다.


하지만, 5.0 이상 API 에선 바꾸기 수훨하지만, 5.0 미만 API 에서는


statusbar 색상을 바꾸기가 쉽지 않다.


본 포스팅은 롤리팝 이후 API를 이용한 statusbar 색상 넣기와


롤리팝 이전 API를 이용한 statusbar 색상 넣기


두가지를 다룰 예정이다.



아래는 롤리팝 버전 이후 API를 이용한 statusbar 색상 넣기이다. 


롤리팝 보다 낮은 버전은 동작하지 않으니 주의하자.




왼쪽의 이미지를 보면,


각 view 영역에서의 색상태그를 알려준다.


statusbar 색상을 바꾸기 위해


res 디렉토리 안에 있는 


value 디렉토리에 접근후 color.xml에


왼쪽과 같이 태그를 작성한다.


<color name= "colorPrimaryDark">원하는색상</color>


왼쪽에서 보이는 view 영역중 바꾸고 싶은 색상이 있다면,


위와 같이 태그이름과 벨류를 정해주면 된다.
















위의 방법은 xml셋팅으로 statusbar를 바꾸는 방법이다.


아래의 방법은 코드적으로 바꿀 수 있는 방법이다.


액티비티 안이라면 아래와 같이 똑같이 작성하면 되지만, ( window = getWindow() )


액티비티가 아니라면 액티비티 참조값에서 메서드를 호출해야한다. ( window = activity.getWindow() )


Window window = getWindow();


window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUENT_STATUS);


window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUND);


window.setStatusBarColor(자신이 바꾸고 싶은 컬러);


롤리팝 API부터 statusbar는 TRANSLUENT를 적용하면 투명 상태가 아니라, 반투명 상태의 색상이 입혀진다.


따라서 TRANSLUENT 속성을 지우고, statusbar 영역의 view를 칠할 수 있게 셋팅을 한다.


셋팅이후 자신의 원하는 색상을 바꿀 수 있다.



다음 포스팅엔 롤리팝 하위 버전에서 상태바 색상을 바꾸는 방법을 포스팅 하겠다.

 





포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅은 많이 쓰이는 View 중 하나인


WebView에 대해서다.


인터넷을 볼 수 있는 브라우저를


안드로이드 view 형태로 본다고 생각하면 된다.


간단하게 쓰는법에 대해 알아볼 것 이다.


View 공간을 먼저 정해야 하므로 아래와 같이 Xml을 코딩한다.


notice_webView_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:paddingTop="100dp"
android:paddingBottom="100dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>

FrameLayout의 패딩값으로 webView의 크기를 정했다.


아래는 java 코딩이다.


MainActivity.java

WebView webView = findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.naver.com");

간단한 코딩으로 네이버를 열어볼 수 있다.



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

안드로이드 SQLite 2편이다.


1편은 아래의 링크로 가면 된다.


http://mommoo.tistory.com/20


1편에서는 SQLite를 쓰기위한 준비사항 과 개념에


관하여 다루었다.


이번 포스팅은 직접 사용 해볼 것이다.


내가 필요한 Column은 id와 pass 값이다.


테이블의 이름은 Info 로 할것이다.


해당 테이블을 만들기 위해


아래와 같이 코딩한다.


public class MommooDB extends SQLiteOpenHelper {
public MommooDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE Info"+"(id Text primary key, pass Text);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
onCreate(db);
}
}


Info라는 db파일을 처음 접근할때 onCreate 메서드가 실행되고,


그 결과로 Info 테이블이 생성 될 것이다.


해당 쿼리문은 id 와 pass 를 문자열로 저장하고 id를 primary key로 지정하는 쿼리문이다.


사용하는 방법은 아래와 같다. 간단하게 insert 와 select를 해볼 것 이다.


ex ) insert



MommooDB mommooDB = new MommooDB(this,"Info",null,1);
SQLiteDatabase database = mommooDB.getWritableDatabase();
String id = "Mommoo";
String pass = "mm";
String sql = "insert into Info values('"+id+"','"+pass+"')";
database.execSQL(sql);



혹시, 버전을 바꾸고 싶으면 생성자안 4번째 인자만 바꿔주면 된다. ( 버전은 1이상만 가능)


ex) select


select를 할때는 일반적으로 아래와 같이 커서 클래스를 쓴다. 


MommooDB mommooDB = new MommooDB(this,"Info",null,1);
SQLiteDatabase database = mommooDB.getReadableDatabase();
String sql = "select * from Info where id='Mommoo'";
Cursor cursor = database.rawQuery(sql,null);
while(cursor.moveToNext()){
String id = cursor.getString(0);
String pass = cursor.getString(1);
}


cursor.moveToNext() 메서드를 통해, 테이블의 튜플 갯수만큼 루프를 돈다.


상황에 맞게 코딩하면 되겠다.





insert문은 mommooDB.getWritableDatabase(); 를 사용했고 select 문은 mommooDB.getReadableDatabase(); 를 사용했는데,


메서드명 에서도 알 수 있드시, 쓰기모드 읽기모드 이다. insert는 db값을 입력시켜야 하므로 쓰기모드를 사용했고,


select는 디비 튜플값만 불러오면 되므로 읽기모드를 사용한것이다.


위와같이 데이터베이스를 사요한 후 에는 꼭 아래와 같이 close를 해준다.



mommooDB.close();
database.close();
cursor.close();



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

안드로이드는 기존에 자바에서 제공하는 Thread 뿐만아니라


AsyncTask라는 스레드 객체를 제공한다.


안드로이드가 AsyncTask 라는 객체를 왜 만들어 제공할까?


아래의 글은 Android Developer 에서 발췌한 일부 글이다.


AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as ExecutorThreadPoolExecutor and FutureTask.

An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread.



요약하자면, AsyncTask는 백그라운드 스레드 와 UI 스레드를 같이 쓰기 쉽게 설계했으며, 


일반 스레드와 달리, 간단한 작업에 적합하게 만들었다고 설명되어 있다.


백그라운드 스레드와 UI 스레드를 같이 쓰기 쉽다는 말이 무슨 뜻일까?


아래의 설명을 보자.



안드로이드에서의 일처리는 메인스레드(UI 스레드)가 담당한다. 특히 UI와 관련된( ex) TextView,ImageView )


일처리는 메인스레드만 담당 하게끔 설계를 했다. 그래서 메인스레드를 UI스레드라고도 불린다.



따라서 복잡한 계산은 백그라운드 스레드( 메인 스레드가 아닌 다른 스레드의 총칭)에 맡긴후 


계산된 결과값을 UI스레드에게 일을 시켜야 하는 것이다.


그래서 AysncTask 라는 객체를 만들었고 위에서 설명한 일들을 쉽게 구현 할 수 있도록 메서드를 제공한다.


아래의 AysncTask 예시를 보자.

import android.os.AsyncTask;

public class MommooAsyncTask extends AsyncTask<String,Void,String>{

public String result;

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {
return result;
}

@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}


AsyncTask객체는 abstract로 작성되었다. 따라서, 익명클래스로 사용허던가 위와 같이 상속을 통해서 사용해야 한다.


public class MommooAsyncTask extends AsyncTask<String,Void,String>{


제네릭 인자3개를 정해야한다. 


첫번째 인자는 doInBackground 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.


두번째 인자는 onProgressUpdate 메서드에 선언하는 가변인수 매개변수의 타입을 정한다.


세번째 인자는 onPostExecute 메서드에 선언하는 매개변수의 타입을 정한다.


@Override
protected void onPreExecute() {
super.onPreExecute();
}


첫번째 메서드다. 해당 메서드는 이름에서 볼 수 있드시,  background스레드를 실행하기전 준비 단계이다.


변수의 초기화나, 네트워크 통신전 셋팅해야할 것들을 위의 메서드 공간에 작성한다. 



@Override
protected String doInBackground(String... params) {
return result;
}


두번째 메서드다. 해당 메서드가 background 스레드로 일처리를 해주는 곳이다.


보통 네트워크, 병행 일처리등을 위 메서드 공간에 작성한다.


중요한건 마찬가지로 스레드 이므로 UI스레드가 어떤 일을 하고 있는지 상관없이


별개의 일을 진행한다는 점이다. 따라서 AysncTask는 비동기적으로 작동한다.



@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}


세번째 메서드는 doInBackground 메서드에서 중간중간에 UI스레드 에게 일처리를 맡겨야 하는 상황일때


쓴다. 매개변수로 Void를 받으므로, doInBackground안에 실제인자가 없이,


 publishProgress( ) 메서드를 호출하면 BackgroundThread 중간에 mainThread에게 일을 시킬 수 있다.



@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}


마지막 메서드다. background Thread가 일을 끝마치고 리턴값으로 result를 넘겨준다.


그 값을 지금 보고 있는 해당 메서드가 매개변수로 받은후 받은 데이터를 토데로


UI스레드에 일처리를 시킬때 쓰는 메서드이다.


보통 UI변경 ( ex) textview.setText("~~") )할때 많이 사용된다. 왜냐면


위에서도 말했다시피 UI변경은 메인스레드가 아닌 다른 스레드에서의 변경은 막았기 때문이다.


위에서 만든 AysncTask를 사용 하는방법은 아래와 같이 하면된다.


MommooAsyncTask asyncTask = new MommooAsyncTask();
asyncTask.execute();


execute의 아규먼트는 doInBackground에서 받는 String... 가변인수이다. 필요시 넣으면 되겠다.



해당 URL은 저번에 작성한 포스팅인데 AsyncTask를 사용하였다. 예시로 보면 될 것이다.


http://mommoo.tistory.com/5



여기까지가 준비한 AysncTask의 내용이다.


직접 Thread와 Handler 를 구현해보고 작성해봤다면,


안드로이드가 제공해주는 AysncTask가 얼마나 편리한지 알 수 있을 것이다.



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅할 내용은 Toolbar 위젯이다.


Toolbar 위젯이 뭔지 아래의 설명을 보자.


해당 내용은 안드로이드 디벨로퍼 API문서이다.




A standard toolbar for use within application content.

A Toolbar is a generalization of action bars for use within application layouts. While an action bar is traditionally part of an Activity's opaque window decor controlled by the framework, a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy. An application may choose to designate a Toolbar as the action bar for an Activity using the setActionBar() method.



요약하자면, 어플리케이션의 제어를 도와주는 액션바는 스크린의 최상위 뷰인 윈도우 decor에 붙여져 있어 다루기 어렵다.

하지만 toolbar는 어느 뷰에서나 종속관계 상관없이 다채롭게 사용가능하며 actionbar 사용하듯 toolbar를 사용할 수 있다는 내용이다.

머터리얼 디자인이 등장함에 따라 UI의 큰 변화가 있었다. ActionBar를 사용시 구현하기 어려운 경우가 많아 

toolbar란 위젯을 만든거 같다. 자세한 내용을 보고 싶다면 아래의 링크를 참조하길 바란다.

http://developer.android.com/intl/ko/reference/android/widget/Toolbar.html 




해당 위젯은 롤리팝 부터 나온 위젯이기 때문에(API level 21) 만약 하위 os에서 쓰고 싶다면 서포트 라이브러리가 필요하다.


build.gradle에서 dependencies에 아래와 같이 추가해준다.

dependencies {

compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'

}


actionBar 대신에 toolbar를 쓸 것 이므로, 액션바가 없는 테마로 변경해야한다.


values 폴더에 styles.xml 안에다가 해당 테마를 만들어준다.


<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>



Activity에 붙일 레이아웃을 아래와 같이 작성한다. (main_activity.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:theme="@style/AppTheme.NoActionBar">
<android.support.v7.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
app:titleTextColor="#fff"
android:id="@+id/toolbar"
android:background="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
</android.support.v7.widget.Toolbar>
</LinearLayout>


레이아웃을 작성후 액티비티의 onCreate 메서드에 아래와 같이 작성한다.


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitleTextColor(Color.WHITE);
}

아래의 이미지는 결과물이다.








포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘은 getColor 메서드에 대해 포스팅 합니다.


getColor 메서드는 안드로이드 value폴더에 colors.xml에 저장된


컬러값들을 가져오는 메서드입니다.


colors.xml에 저장할 시, 마치 전역변수처럼 값들을 호출 할 수 있기때문에


자주 쓰입니다. 쓰는법은 아래와 같습니다.


int color = context.getResource().getColor(R.color.자신의ID값); 


만약 액티비티 메서드 안이라면, 이미 context정보가 있기때문에


int color = (this).getResource().getColor(R.color.자신의ID값);


이렇게 쓰입니다. 하지만 API23에서 getColor 메서드는 depercated 되었습니다.


따라서 getColor 메서드 대신 아래의 메서드를 사용하여 deprecated에 대응해야 합니다.


int color = ContextCompat(context,R.color.자신의ID값);


마찬가지로 액티비티 메서드 안 이라면, context 대신에 this를 쓰면 되겠지요.





포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts