본문 바로가기

분류 전체보기242

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.
숫자 천단위마다 (,) 찍는 방법 String.format("%,d", value);value에 숫자형 데이터를 넣는다. String.format에서 지원하는 종류 ConverterFlagExplanationd A decimal integer.f A float.n A new line character appropriate to the platform running the application. You should always use %n, rather than \n.tB A date & time conversion—locale-specific full name of month.td, te A date & time conversion—2-digit day of month. td has leading zeroes as needed, te d.. 2015. 5. 28.
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.
way to save from intent image data Bitmap source = MediaStore.Images.Media.getBitmap(act.getContentResolver(), data.getData());Bitmap img = Bitmap.createScaledBitmap(source, width, height, false); File file = new File(getActivity().getFilesDir(),"filename"); fos = new FileOutputStream(file);img.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();fos.close();source.recycle();img.recycle(); byteArrayInputStream이라든지 안쓰고 그냥 한 번.. 2015. 5. 19.