본문 바로가기

android13

View를 서서히 나오고 사라지게 하는 간단 방법 Activity를 전환할때 서서히 나오고 사라지는 등의 애니메이션을 넣을 수 있다 당연히 Activity가 아닌 일반 View 도 가능하다 하지만 View 에서는 한가지 주의할 점이 있다. Activity는 전환 애니메이션을 마치면 자동으로 생성되거나 없어지지만 View는 그렇지 않다는 것이다. 즉, 애니메이션이 시작 또는 끝날때 View를 부모뷰에서 빼고 넣거나 보이게 또는 보이지 않게 처리 해주어야 한다. 애니메이션을 불러와 시작하는 코드 //나오기 fun startAnimationWithShow(context: Context, view: View, id: Int) { view.visibility = View.VISIBLE //애니메이션 전에 뷰를 보이게 한다 view.startAnimation(An.. 2022. 3. 13.
drawText의 문자가 밑으로 삐져나오지 않게 하기 커스텀 뷰를 만들어 쓸때 drawText로 문자를 출력한다. 그런데 문자 위치가 살짝 밑으로 치우쳐 있는 느낌을 받곤 한다. 처음엔 기분탓이라고 생각했지만... 계속된 찝찝함에 확인해 보니... 아주 미세하게 아래로 내려와 있다는 사실을 깨달았다. 한 예이다. override fun onDraw(canvas: Canvas) { super.onDraw(canvas) val rect = RectF(100f, 100f, 300f, 300f) val rectPaint = TextPaint().apply { flags = Paint.ANTI_ALIAS_FLAG color = Color.LTGRAY } val text = "Test" val textPaint = TextPaint().apply { flags = P.. 2019. 6. 24.
FragmentPaper에서 ListView가 매번 초기화되지 않도록 하기 대부분의 앱은 탭과 리스트로 구성된다. 많은 정보를 간편하면서도 체계적으로 보여줄수 있기 때문이다. Android에서 이러한 구조는 보통 FragmentPaper에 ListView를 넣어 구현한다. FragmentPaper는 메모리 관리를 위해 사용자가 보고 있는 페이지과 양옆의 페이지만 유지하고 나머지는 죽이는데 내 경험상 완전히 죽이는것이 아니라 Fragment의 생명주기만 끝내는것 같다. 결과적으로, 페이지를 옮길때마다 Fragment가 초기화되어 그 안의 ListView 내용도 다 지워진다. 이를 방지하는 방법이 따로 있을지도 모르겠지만 나는 다음과 같이 onCreateView()에 몇줄을 코딩해 해결하곤 한다. Fragment의 생명주기는 다시 시작되지만 Class 자체의 객체변수들은 그대로 남.. 2019. 5. 23.
Dialog를 닫았는데 background로 나갔다 들어오니 다시 열린다??? 안드로이드에서 대화상자를 띄울때 DialogFragment를 사용한다. 그런데 사용후 닫았는데도 화면을 끄거나 홈버튼을 누르거나 다른 앱을 잠시 사용한후 들어오면... 닫혔던 DialogFragment 놈이 되살아나 다시 뜨는 경우가 있다. 알고보니 dismiss 리스너를 등록하면 그런다. 즉, setDismissListener에 리스너를 넣었다면 반드시 종료할때 dismiss()를 호출해주어야 한다. 그러지않고 back 버튼이나 바깥화면 터치로 닫으면 나중에 다시 떠버린다. 당황하지 말고 다음과 같이 하자... dialog.setOnDismissListener { //리스너 내용 } dialog.setOnKeyListener { dialogInterface, i, keyEvent -> if (keyEv.. 2019. 3. 13.
EditText에 자동으로 단위 콤마 넣기 NumberFormat 을 이용하면 숫자에 단위 콤마를 쉽게 찍을수 있다. 하지만 이를 EditText에 적용할려고 하면 한가지 문제가 생긴다. 입력할때마다 콤마가 찍혀야 하는데... addTextChangedListener에서 NumberFormat으로 콤마를 찍으면 당연히 텍스트가 변경되므로 다시 리스너가 호출된다. 즉, 호출이 무한 반복되면서 앱이 멈추게 된다. 그래서 살짝 꼼수를 부려봤다. EditText 밑에 같은 크기의 TextView를 깔고 여기에 콤마를 찍은 텍스트를 대신 써주고, 후에 EditText를 동기화 하는 것이다. 물론, EditText는 투명하게 설정해 안보이게 한다. 사실 임시 방편으로 만든것인데.. 생각보다 잘 작동해 계속 쓰고 있다 ㅎㅎㅎ 소스는 다음과 같다. 요즘 뜨고 .. 2019. 1. 17.
Intent 전달 방식을 모방하여 부모 activity를 호출하기 IOS에서는 prepare()을 통해서 부모 controller를 쉽게 전달할 수 있다. 하지만 Android에서는 Intent로 activity를 전달하기 쉽지 않다. 뭐, Intent 말고도 여러 전달 방식이 있기 때문에 상관없지만... 깔끔하게 코딩하고 싶은 마음에 함 만들어 보았다. static을 이용하지만, 마치 Intent로 전달하는것 같은 느낌으로ㅎㅎ public class BaseActivity extends FragmentActivity { private static final String KEY_PARAM_CONTEXT_ID = "ParamContextId"; //전달할 Context를 담는 Map private static HashMap mParamContextMap = null; /.. 2018. 6. 7.
ListView에 EditText를 넣을때 반드시 살펴봐야 할점 설정 페이지를 만들때 ListView로 EditText를 넣고 싶은 유혹에 빠진다 하지만 ListView의 특성상 사실 EditText는 적합하지 않다. ListView는 각각의 row뷰를 재사용하여 메모리를 아끼기 때문에 EditText의 변경값을 일일이 저장해 두었다가 다시 불려줘야 한다. 그리고 이때 진짜 주의할게 하나 있다. 변경 리스너의 중복을 방지하는 것이다. 반드시 재사용 뷰의 예전 리스너를 지워줘야 한다. 안그러면 예전 목록들과 뒤죽박죽 되버린다. 이해를 돕기 위해 리스너를 지우지 않았을때와 지웠을때도 비교해 보았다. public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstan.. 2017. 9. 11.
버튼의 Selector 이미지를 간절히 가져오고 싶다면? 보통 Selector를 xml로 아래와 같이 만들어 놓는다. 그리고 버튼 background에 적용한다. 별로~ 그럴일은 없지만 만약 이 selector의 android:drawable 이미지를 자바 코드상으로 불려오고 싶다면?? private Drawable[] getPressImages(View v) { //Selector 이미지를 StateListDrawable 객체로 불러옴 StateListDrawable statedrawable = (StateListDrawable)v.getBackground(); if(statedrawable != null) { try { //Veiw의 현재 이미지 상태를 배열에 가져옴 int[] currentstate = v.getDrawableState(); //이미지를 .. 2016. 3. 28.
이미지를 싹뚝 자를때 꼭 알아야 할 비밀 이미지를 전체가 아닌 일부분만 출력하고 싶을때 사용하는 기법이 Image Clipping 이다. 게임을 만들때는 없어서는 안되는 아주 고마운 녀석이다. 보통 Clipper 객체를 만들어 사용하는데... 어렸을때는 왜 굳이 객체까지 만들어서 이미지를 자르나.. 그냥 자르면 되지.. 라며 쓸데 없는것이라고 생각했었다. 하지만 어른이 되고 개발을 업으로 살다보니 조상님들의 지혜에 감탄하듯 그 이유를 깨닫게 되었다ㅎㅎ 아주 단순하고 지극히 당연하지만... 그래서 간과하기 쉬운 클리핑의 원리! 비밀 아닌 비밀같은 클리핑을 알아보자~ 위 그림처럼 클리핑은 이미지 원본크기와 출력크기가 다르다는 것이 문제이다. 또 원본좌표는 (0, 0)에서 시작되지만 출력좌료는 스크린좌표가 더해진다. 이것을 같은 크기와 좌표로 작업할.. 2015. 10. 26.
Fragment에서 startActivityForResult() 호출시 onActivityResult() requestCode 문제 Fragment에서 startActivityForResult()를 호출했을때 onActivityResult()의 requestCode가 잘못 올 때가 있다. 즉, 분명 requestCode를 100으로 호출했는데 65640와 같은 이상한 값이 나오는 경우이다. 해결방법은 간단하다. startActivityForResult()를 getActivity().startActivityForResult()로 바꾸면 된다. 아마도 Fragment에서 직접 호출하면 부모액티비티로 값이 전달되지 않는듯 하다. 도움이 되셨다면~ 정성으로 빚은 저희 앱! 많은 이용 바래요:) https://meorimal.com/index.html?tab=spaceship 우주선 - 방치형 인공지능 투자 체험기 미리 맛보는 인공지능 투자!.. 2015. 6. 22.