2017-10-20 2 views
4

Ich habe versucht, diesen Kotlin-Code in Java zu übersetzen, da das Projekt in Java ist. Ich übersetze, indem ich in die Kotlin-Syntax schaue. Es gibt jedoch noch andere, die ich schwer verstehen kann.Wie zu interpretieren und zu übersetzen Kotlin-Code zu Java?

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

Im Einzelnen:

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

Für die setViewPagerScroller konnte ich den ersten Teil übersetzen.

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-otlin-source-file-to-a-java-source-file –

+0

@Murat K. Es wird nicht dekompilieren. Ich habe das versucht, also übersetze ich den Code gerade manuell. – Woppi

Antwort

3

Verfahren setViewPagerScroller verwendet Kotlin anonymous inner class Syntax. Das ist der "Objekt" -Teil, der in der Java-Syntax kein echtes Gegenstück hat.

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

Und das as Schlüsselwort ist wie ein Casting in Java. Hoffentlich können Sie dies verwenden, um fun generateFinalButtonBehaviour() zu übersetzen, es enthält mehr davon.

Das Lazy Konstrukt wird nicht überraschend in Java mehr verbose. Sie müssen Disziplin anwenden, um nicht falsch auf den Viewpager zuzugreifen, wenn Sie sich für die folgende Struktur entscheiden.

Sie können auch eine Klasse verwenden, um eine verzögerte Initialisierung Ihrer Felder genauer darzustellen. (Damit Sie nicht versehentlich auf ein Feld zugreifen können, das Sie initialisiert haben wollten). Dies wird noch ausführlicher, könnte sich aber lohnen.

+0

Danke für die Hilfe, deshalb kann ich nicht das Äquivalent von "object:" in Java googlen. Wie wäre es mit der LottieAnimationView? Ich kann nicht scheinen, es zu übersetzen ... private LottieAnimationView animationView; public LottieAnimationView getAnimationView() { (Ansichtsgruppe) IntroWalkthroughActivity.this.getRootView(). Inflate (R.layout.activity_intro_app_walkthrough, false); } – Woppi

+0

Stellen Sie sicher, dass Sie die richtigen Objekte zu den richtigen Klassen bei Bedarf zu werfen und dass Sie am Ende zu 'LottieAnimationView' Cast und dann speichern Sie es in Ihrem Feld – Adam

+0

okies wird versuchen, es herauszufinden und zu veröffentlichen, sobald ich :) Danke viel. – Woppi