Comment interpréter et traduire le code Kotlin en Java?
J'ai essayé de traduire ce code Kotlin en Java depuis que le projet est en Java. Je traduis en examinant la syntaxe Kotlin. Cependant, il y en a encore d'autres que j'ai du mal à comprendre.
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);
La méthode setViewPagerScroller utilise la syntaxe de classe interne anonyme de kotlin . C'est la partie «objet» qui n'a pas d'équivalent réel 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 as
mot-clé est comme un casting 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 devient sans surprise plus verbeuse en java. Vous devez utiliser la discipline pour ne pas accéder à la visionneuse à 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 différée de vos champs. (Pour que vous ne puissiez pas accéder par erreur à un champ que vous vouliez initialiser paresseusement) Cela devient encore plus détaillé mais pourrait en valoir la peine.