본문 바로가기

Android43

image caching LruCache 보통 bitmap을 캐시 하는데 사용한다는데, 나는 drawable을 캐싱했다. 되던데... bitmap을 캐싱하는 이유가 있을 것 같은데 모르겠다. 사이즈 문제...려나? 베남식에서도 문제는 없던데. 아무튼. LruCache는 해쉬맵을 사용해서 key와 value로 구분해서 캐쉬한다. size는 기본적으로 캐싱할 아이템 '개수'를 의미한다. 따로 오버라이드 하지 않는다면 사이즈는 이미지 크기에 관계없이 개수만 체크할 것이다.(캐쉬 사이즈가 거어어업나 커지면 어떨런지...) 방법은 기본적으로 간단. 아래 예제 코드를 올리지만 굳이 저렇게 할 필요는 없다. 그냥 put, get 하는 부분만 잘 설정하면 된다.무엇보다 이미지 캐싱에 쓰이기 때문에 비동기 작업에 사용하는 것 때문에 다중 쓰레드에 대해 처리를 .. 2015. 6. 17.
문자열의 빈 공백(white space) 체크하는 방법 String s = " "; 위와 같은 문자열을 단순히 string.match()등으로는 체크할 수가 없다. 하지만 텍스트를 입력하는데 빈 공백을 놔둘 수는 없는 법.. 그럴 땐 trim()을 이용하자. s.trim() 은 빈 공백을 없애준다. 내부 코드는 아래와 같다. public String trim() { int start = offset, last = offset + count - 1; int end = last; while ((start 2015. 6. 8.
keyboard imeOptions 가 안 될 때 키보드 옵션을 설정하다보면 imeOptions를 사용해야 할 때가 많다. 사용자 경험 측면에서도 유리하고, 무엇보다 안드로이드는 키보드의 상태(여/닫)를 얻는 방법도 까다롭고, 생각처럼 잘 되지 않기 때문에 키보드 조작은 키보드 내에서 하는게 유리하다. 그런데 저놈의 옵션이 안 먹힐 때가 많다는게 함정이다. 방법은 딱 하나. EditText의 옵션에 android:singleLine="true" 해당 옵션을 주는 것이다. 개인적으로 참 명명이 맘에 안드는게, 누가 저 이름을 보고 해결방법이라고 생각할 수 있을까. 어쨋든 저 옵션이 없으면 multiLine인 셈이고, 그럴 경우 키보드의 enter키는 절대 다른 옵션에 먹히지 않기 때문에 imeOptions를 어떤걸 주더라도 enter가 표시된다. 2015. 6. 8.
recyclerView에 contextMenu 사용하기 listView의 경우는 listView 자체를 contextMenu로 등록했으나 recyclerView에는 불가능하다. 왜냐하면 recyclerView가 View.ViewGroup을 상속받은 것이기 때문이다. 이 때문에 recyclerView 자체에는 등록이 불가능하고, adapter안에 itemView에 등록하면 이상한 현상을 경험하게 된다. 때문에, contextMenu를 등록하기 위해서는 recyclerView의 Holder 내의 view에 등록하는 방법을 사용하면 된다. 예시)public static class ViewHolder extends RecyclerView.ViewHolder implements OnCreateContextMenuListener { TextView tvTitle; Im.. 2015. 6. 2.
recyclerView 데이터가 바뀌었을 때 알 수 있는 방법 registerAdapterDataObserver를 어댑터에 연결해주면 된다. 데이터가 바뀌거나 제거되거나 새로 추가되거나 이동됐을 때를 알 수 있다.(onItemRangeChanged()는 다른 것들을 다 포함할 것 같지만 데이터가 제거되거나 할 때 호출되지는 않는다)아래는 예시 Adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { super.onChanged(); notifyDataSetChanged(); } @Override public void onItemRangeChanged(int positionStart, int itemCount) { Log.d.. 2015. 6. 2.
listView 아이템 추가 후 화면 위치 이동시키기 listView에 아이템을 추가하면 하단이 뜬다. 어디서는 상단만 뜬다던데, 난 하단만 뜨더라. invalidate()나 notifyDataSetChanged()에서 자동으로 하단을 위치시키는 듯 하다. 사실 이상한 건 없지만(보통은 아이템 최하단에 추가되니까), 어쩌다보니 최상단에 추가된 아이템을 출력해야했고, 위치를 최상단으로 이동시킬 필요가 있었다. 방법은 invalidate()같은걸로는 안되고, listView의 내장 함수 중 setSelection(int position) 이란 놈이 있다. setSelectionFromtoTop(int position, int y)도 있는데 난 안먹더라. 왜인지는 잘... 아무튼 setSelection으로 아이템의 위치를 지정해주면 알아서 그 아이템이 위치한 화.. 2015. 6. 1.
asyncTask 비동기 asyncTask 예제 private class LoadImage extends AsyncTask { private String uri; private View view; // doInBackground 실행 전 준비 단계(UI 쓰레드) @Override protected void onPreExecute() { super.onPreExecute(); }// 비동기 작업(개별 쓰레드) @Override protected Drawable doInBackground(Void... params) { publishProgress(); // onProgressUpdate() 호출 } return d; }// doInBackground()에서 UI쓰레드로 작업할 일이 있을 때 호출해서 사용하는 함수 @Over.. 2015. 5. 22.
bitmap to Drawable new BitmapDrawable(getRecourse(), Bitmap); 파라미터에 따라 파일 경로로도 가능하다. 2015. 5. 21.
현재 시간 구하기 long time = System.getCurrentTimeMillis();// 현재 시간(날짜 포함)을 구한다. Date date = new Date(time);// Date타입에 시간을 넣는다. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss", Locale.getDefault());// 2번째 파라미터는 없어도 되지만, 형식만 지정할 경우 안드로이드가 노랗게 표시해준다. 무시해도 상관은 없지만 지정하자. String name = dateFormat.format(date);// 위에 지정한 포맷에 Date타입의 시간 정보를 넣고, String으로 바꿔준다. 이 단계에서부터 사용한다. 코드 수는 줄이기 나름. 2015. 5. 21.