2017-10-20 5 views
4

프로젝트가 Java에 있기 때문에이 Kotlin 코드를 Java로 변환하려고했습니다. 나는 코 틀린 문법을 조사하여 번역 중이다. 그러나, 나는 아직도 어려움을 이해하고있는 다른 것들이 있습니다.kotlin 코드를 해석하여 Java로 변환하는 방법은 무엇입니까?

특히

https://github.com/airbnb/lottie-android/blob/master/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt

다음 setViewPagerScroller를 들어

private val animationView: LottieAnimationView by lazy { 
    rootView.inflate(R.layout.app_intro_animation_view, false) as LottieAnimationView 
} 

private val viewPager: LockableViewPager by lazy { 
    findViewById<LockableViewPager>(R.id.intro_activity_viewPager) 
} 

override fun generateFinalButtonBehaviour(): IntroButton.Behaviour { 
    return object : IntroButton.Behaviour { 
     override fun setActivity(activity: IntroActivity) { finish() } 
     override fun getActivity(): IntroActivity? = null 
     override fun run() {} 
    } 
} 

private fun setViewPagerScroller() { 
    try { 
     val scrollerField = ViewPager::class.java.getDeclaredField("mScroller") 
     scrollerField.isAccessible = true 
     val interpolator = ViewPager::class.java.getDeclaredField("sInterpolator") 
     interpolator.isAccessible = true 

     val scroller = object : Scroller(this, interpolator.get(null) as Interpolator) { 
      override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) { 
       super.startScroll(startX, startY, dx, dy, duration * 7) 
      } 
     } 
     scrollerField.set(viewPager, scroller) 
    } catch (e: NoSuchFieldException) { 
     // Do nothing. 
    } catch (e: IllegalAccessException) { 
     // Do nothing. 
    } 
} 

, 나는 첫 번째 부분을 번역 할 수 있었다.

Field scrollerField = ViewPager.class.getDeclaredField("mScroller"); 
scrollerField.setAccessible(true); 

Field interpolator = ViewPager.class.getDeclaredField("sInterpolator"); 
interpolator.setAccessible(true); 
+0

https://stackoverflow.com/questions/34957430/how-to-convert-a-kotlin-source-file-to-a-java-source-file –

+0

@Murat K. 디 컴파일하지 않습니다. 나는 이것을 시도하여 현재 코드를 수동으로 번역 중이다. – Woppi

답변

3

setViewPagerScroller 메소드는 kotlin anonymous inner class 구문을 사용합니다. 이것이 자바 구문에서 실제 객체가없는 '객체'부분입니다.

private void setViewPagerScroller() { 
    try { 
     Field scrollerField = ViewPager.class.getDeclaredField("mScroller"); 
     scrollerField.setAccessible(true); 

     Field interpolator = ViewPager.class.getDeclaredField("sInterpolator"); 
     interpolator.setAccessible(true); 

     Scroller scroller = new Scroller(this, (android.view.animation.Interpolator) interpolator.get(null)){ 

      @Override 
      public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
       super.startScroll(startX, startY, dx, dy, duration * 7); 
      } 
     } 

     scrollerField.set(viewPager, scroller); 
    } catch (NoSuchFieldException error) { 
     // Do nothing. 
    } catch (IllegalAccessException error) { 
     // Do nothing. 
    } 
} 

그리고 as 키워드는 java의 캐스팅과 같습니다. 바라기를이 번역을 사용하여 fun generateFinalButtonBehaviour(), 더 많이 포함되어 있습니다.

Lazy 구조는 놀랍지 않게 자바에서 더 자세한 정보를 얻습니다. 아래의 구조를 따르기로 선택했다면 뷰 페이지에 잘못 액세스하기 위해 규율을 사용해야합니다.

private LockableViewPager viewPager; 

private LockableViewPager getViewPager(){ 
    if(viewPager == null){ 
     // produce viewpager and store in field 
    } 
    return viewPager; 
} 

클래스를 사용하여 필드의 지연 초기화를보다 정확하게 나타낼 수도 있습니다. (실수로 lazily 초기화하려는 필드에 실수로 액세스 할 수 없도록) 이것은 더욱 장황 해지지 만 가치가있을 수 있습니다.

+0

도움을 주셔서 감사합니다. 그래서 내가 자바에서 "object :"와 동등한 Google을 구현할 수 없습니다. LottieAnimationView는 어떻습니까? 번역 할 수없는 ... 개인 LottieAnimationView animationView; public LottieAnimationView getAnimationView() { (ViewGroup) IntroWalkthroughActivity.this.getRootView(). inflate (R.layout.activity_intro_app_walkthrough, false); } – Woppi

+0

올바른 개체를 올바른 클래스로 캐스팅했는지 확인하십시오. 결국 LottieAnimationView로 캐스팅 한 다음 필드에 저장하십시오. – Adam

+0

okies는 일단 확인하고 시도하면 시도합니다. 감사합니다. 감사합니다. 많이. – Woppi