본문 바로가기

Android.log

코드로 View 에 id 지정하기

반응형

RelativeLayout 이나 ConstraintLayout 으로 커스텀뷰를 만드는 경우 직접 생성한 뷰로 위치 관계를 지정하는 경우 id가 지정되어 있지 않아서 위치를 정의 할 수 없습니다.


xml 상에서 android:id 로 지정한 경우 빌드 되면서 R.java에 자동으로 id 값이 생성 되지만, view 를 직접 생성하는 경우 setId() 메서드로 직접 ID 값을 지정해 주어야 합니다.

id 값으로 임의의 1,2,3 또는 System.currentTimeMillis() 같이 생성되는 임의의 숫자를 넣어 줘도 동작은 되지만 뭔가 찝찝합니다.



그래서!! 구글에서 메서드를 만들어 줬습니다. 하지만 SDK 17 이상에서만 쓸 수 있습니다.


그래서!! 구글에서 appCompat-v7 에도 추가를 해주었습니다. 하지만 appCompat-v7 27.1.1 이상에서만 쓸수 있습니다.




1. 앱의 appCompat-v7 버전이 27.1.1 이상이다

  • ViewCompat.generateViewId() 를 호출 하시면 됩니다.


2. 앱의 minSDK 가 17 이상이다.

  • View.generateViewId() 를 호출 하시면 됩니다.

3. 앱의 appCompat-v7 버전도 낮고 SDK 17 하위 버전을 지원해야 한다.

  • 버전 분기 하여 generateViewId() 메서드를 직접 구현하셔야 합니다. SDK 안에 구현되어있는 로직이 복잡하지 않아서 그래로 추가해 놓으시면 됩니다.
  • private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

    public static int generateViewId() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
    return generateViewIdSdk17Under();
    } else {
    return View.generateViewId();

    }
    }

    private static int generateViewIdSdk17Under() {
    for (;;) {
    final int result = sNextGeneratedId.get();
    int newValue = result + 1;
    if (newValue > 0x00FFFFFF) newValue = 1;
    if (sNextGeneratedId.compareAndSet(result, newValue)) {
    return result;
    }
    }
    }



각각의 상황에 맞는 방법으로 생성된 ID 를 View 에 setId() 로 넣어 주시고, 커스텀뷰 구현을 시작하시면 됩니다!!


이제 시작 입니다!!!




참고링크


https://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts


https://code.i-harness.com/ko-kr/q/1a2879



반응형