2017-10-20 2 views
4

J'ai essayé de traduire ce code de Kotlin en Java puisque le projet est en Java. Je traduis en regardant dans la syntaxe de Kotlin. Cependant, il y en a d'autres que j'ai du mal à comprendre.Comment interpréter et traduire le code kotlin en java?

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

Plus précisément:

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. 
    } 
} 

Pour le setViewPagerScroller, j'ai pu traduire la première partie.

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. Il ne se décompilera pas. J'ai essayé ceci donc je suis en train de traduire manuellement le code. – Woppi

Répondre

3

Le procédé utilise setViewPagerScroller Kotlin anonymous inner class syntaxe. C'est la partie "objet" qui n'a pas de contrepartie réelle dans la syntaxe 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. 
    } 
} 

Et le mot-clé as est comme une coulée en java. J'espère que vous pouvez l'utiliser pour traduire fun generateFinalButtonBehaviour(), il contient plus de la même chose.

La construction Lazy obtient sans surprise plus de détails en java. Vous devez faire preuve de discipline pour ne pas accéder au viewpager à tort si vous choisissez de suivre la structure ci-dessous.

private LockableViewPager viewPager; 

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

Vous pouvez également utiliser une classe pour représenter plus précisément une initialisation paresseuse de vos champs. (De sorte que vous ne pouvez pas par erreur accéder à un champ que vous vouliez être initialisé paresseusement) Cela devient encore plus verbeux mais pourrait en valoir la peine.

+0

Merci pour l'aide, c'est pourquoi je ne peux pas google l'équivalent de "object:" en java. Que diriez-vous du LottieAnimationView? Je ne peux pas sembler le traduire ... private LottieAnimationView animationView; public LottieAnimationView getAnimationView() { (ViewGroup) IntroWalkthroughActivity.this.getRootView(). Gonfle (R.layout.activity_intro_app_walkthrough, false); } – Woppi

+0

Assurez-vous de lancer les bons objets dans les bonnes classes lorsque vous en avez besoin et que vous finissez par lancer 'LottieAnimationView' et ensuite le stocker dans votre champ – Adam

+0

okies va essayer de comprendre et poster une fois que je fais :) Merci beaucoup. – Woppi