2017-08-21 5 views
3

私はファブを回転させてアイコンを変更しようとしていましたが、何らかの理由でRunnableがまったく機能しません。Android上のフローティングアクションバーで実行可能なRunnable

private val handler: Handler = Handler() 
private var isRotate: Boolean = false 
private val rotate: Animation = RotateAnimation(0.toFloat(),90.toFloat(),0.toFloat(),0.toFloat()) 

private val r: Runnable = Runnable { 
    fun run() { 
      if (isRotate) { 
       fab2.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_menu_camera, null)) 
       isRotate = false 
      } else { 
       fab2.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_menu_gallery, null)) 
       isRotate = true 
      } 
     } 
    } 

override fun onCreate(savedInstanceState: Bundle?) { 

    ... 

    rotate.duration = 1000 
    rotate.repeatCount = 0 
    rotate.repeatMode = Animation.REVERSE 
    rotate.fillAfter = true 

    fab2?.setOnClickListener { view -> 
       ObjectAnimator.ofFloat(view,"rotation",0.toFloat(),90.toFloat()).setDuration(800).start() 
    view.handler.postDelayed(r,400) 
    } 
} 

ボタンの回転が、アイコンOnClickListenerが動作しているが、Runnableではないことを意味は変更されません。ここで

は、コードがあります。

どうすればいいですか?

+0

'fab2 !!。onClickListener'を使うか、' fab2'をnullにできないようにしてください。 safe-call演算子 '?'は、左側の式が 'null'の場合にリスナーを登録するのを無視します。あなたの 'fab2'がおそらく'ヌル 'であることを意味します。 –

+0

ちょうど私が編集したように、問題はfab2がnullではなく、roate関数は正常に動作しますが、ハンドラは正しくありません。 –

答えて

1

あなたはRunnableを間違った方法で宣言しています。宣言したラムダ式は実際にはrun()関数で、別のrun()関数を宣言しています。あなたのオブジェクトを宣言する

正しい方法は次のようになります。

private val r: Runnable = object: Runnable { 
    override fun run() { 
     if (isRotate) { 
      fab2.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_menu_camera, null)) 
      isRotate = false 
     } else { 
      fab2.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_menu_gallery, null)) 
      isRotate = true 
     } 
    } 
} 

または(ラムダ式):

あなたはfab2`がクリックされたときに、 `、あなたがすべき再生されたアニメーションを強制したい場合は
private val r: Runnable = Runnable { 
    if (isRotate) { 
     fab2.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_menu_camera, null)) 
     isRotate = false 
    } else { 
     fab2.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_menu_gallery, null)) 
     isRotate = true 
    } 
} 
関連する問題