2017-10-20 10 views
4

私はプロジェクトがJavaであるので、このKotlinコードをJavaに翻訳しようとしています。私はKotlin構文を調べて翻訳しています。しかし、私は苦労していることがまだあります。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. 
    } 
} 

、私は最初の部分を翻訳することができました。

+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構文を使用します。これは、Javaシンタックスの真の対応がない 'オブジェクト'の部分です。

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構造体は、Javaでは驚くほど冗長になります。下の構造に従うことを選択した場合、ビューページャーに誤ってアクセスしないように規律を守らなければなりません。

private LockableViewPager viewPager; 

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

クラスを使用して、フィールドの遅延初期化をより正確に表すこともできます。 (怠惰に初期化されることを意図したフィールドに誤ってアクセスすることはできないように)これはもっと冗長になりますが、それに値する可能性があります。

+0

助けてくれてありがとう、だから私はGoogleの "object:"と同等のものをjavaでは使えないのです。 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

関連する問題