2017-12-12 14 views
0

私はAndroidプロジェクトのいくつかの場所を使用しているカスタムビューのDSLのようなOnClickリスナー(kotlin)を作成しようとしています。現在作業中です。ビューにはImageView、プライマリテキストビューとセカンダリテキストビューがあります。私はリスナヘルパーを作成しようとしていますが、インターフェイスの特定のメソッドをすべてオーバーライドするのではなく、オーバーライドできるようにしています(this articleから触発されています)。しかし、私はそれを働かせることはできません。実際には、通常のOnClickリスナーを使用しても動作しません。ここでAndroidでkotlinを使用するカスタムビューのDSLのようなOnClick-Listener

は私のErrorMessageViewです:

class ErrorMessageView @JvmOverloads constructor(
    context: Context, 
    attrs: AttributeSet? = null, 
    defStyle: Int = 0, 
    defStyleRes: Int = 0 
    ) : FrameLayout(context, attrs, defStyle, defStyleRes) { 

    private var mOnClickListener: OnErrorMessageViewClickListener? = null 

    init { 
     LayoutInflater.from(context).inflate(
      R.layout.custom_errorview, 
      this, 
      true) 
     ButterKnife.bind(this) 
    } 

    interface OnErrorMessageViewClickListener { 
     fun onImageClick() 
     fun onPrimaryTextClick() 
     fun onSecondaryTextClick() 
    } 

    ... left out for brevity ... 

    fun setOnErrorMessageViewClickListener(
     onViewClickListener: OnErrorMessageViewClickListener?) { 
     this.mOnClickListener = onViewClickListener 
    } 


    fun setOnErrorMessageViewClickListener(init: ErrorMessageViewClickListenerHelper.() -> Unit) { 
     val listener = ErrorMessageViewClickListenerHelper() 
     listener.init() 
    mOnClickListener = listener 
} 

    @OnClick(R.id.image_container) 
    internal fun onImageViewClick() { 
     Timber.d("Clicked image view") 
     mOnClickListener?.onImageClick() 
    } 

    @OnClick(R.id.primary_text_container) 
    internal fun onPrimaryTextViewClick() { 
     Timber.d("Clicked primary textview") 
     mOnClickListener?.onPrimaryTextClick() 
    } 

    @OnClick(R.id.secondary_text_container) 
    internal fun onSecondaryTextViewClick() { 
     Timber.d("Clicked secondary textview") 
     mOnClickListener?.onSecondaryTextClick() 
    } 

} 

そして、ここに私のヘルパークラスです:

private typealias ErrorViewClickListener =() -> Unit 

open class ErrorMessageViewClickListenerHelper : ErrorMessageView.OnErrorMessageViewClickListener { 

    private var mImageClick: ErrorViewClickListener? = null 

    fun onImageClick(onImageClick: ErrorViewClickListener?) { 
     mImageClick = onImageClick 
    } 

    override fun onImageClick() { 
     mImageClick?..invoke() 
    } 

    private var mPrimaryTextClick: ErrorViewClickListener? = null 

    fun onPrimaryTextClick(onPrimaryTextClick: ErrorViewClickListener?) { 
     mPrimaryTextClick = onPrimaryTextClick 
    } 

    override fun onPrimaryTextClick() { 
     mPrimaryTextClick?.invoke() 
    } 

    private var mSecondaryTextClick: ErrorViewClickListener? = null 

    fun onSecondaryTextClick(onSecondaryTextClick: ErrorViewClickListener?) { 
     mSecondaryTextClick = onSecondaryTextClick 
    } 

    override fun onSecondaryTextClick() { 
     mSecondaryTextClick?.invoke() 
    } 
} 

マイレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginStart="24dp" 
    android:layout_marginEnd="24dp"> 

    <android.support.v7.widget.AppCompatImageView 
     android:id="@+id/image_container" 
     android:layout_width="@dimen/dialog_worklist_image_size" 
     android:layout_height="@dimen/dialog_worklist_image_size" 
     android:layout_centerVertical="true" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     tools:ignore="ContentDescription" /> 

    <TextView 
     android:id="@+id/primary_text_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginEnd="24dp" 
     android:layout_marginStart="24dp" 
     android:layout_marginTop="8dp" 
     android:textSize="16sp" 
     android:clickable="true" 
     android:focusable="true" 
     app:layout_constraintEnd_toEndOf="@+id/image_container" 
     app:layout_constraintStart_toStartOf="@+id/image_container" 
     app:layout_constraintTop_toBottomOf="@id/image_container" /> 

    <TextView 
     android:id="@+id/secondary_text_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginEnd="24dp" 
     android:layout_marginStart="24dp" 
     android:textSize="16sp" 
     android:clickable="true" 
     android:focusable="true" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toBottomOf="@id/primary_text_container" /> 
</android.support.constraint.ConstraintLayout> 

は、私はこのような私のコードでヘルパーを使用しています、何もログに記録されません(ほとんどの場合、クリックリストが添付されていないかのようです):

override fun setWorklistNotEnabledMessage(showMessage: Boolean) { 
    if (showMessage) { 
     mView?.dialog_worklist_recyclerview?.visibility = View.GONE 
     mView?.dialog_worklist_errorview?.apply { 
      visibility = View.VISIBLE 
      setSecondaryTextClickListener(View.OnClickListener { Timber.d("Test secondary click") }) 
      setErrorDrawable(R.drawable.ic_worklist_disabled_black_24dp) 
      setPrimaryText(R.string.global_worklist_disabled_error) 
      setSecondaryText(R.string.dialog_worklist_worklist_disabled_error_secondary_text) 
      setOnErrorMessageViewClickListener { 
       onSecondaryTextClick { Timber.d("Test secondary click") } 
       onPrimaryTextClick { Timber.d("Test primary click") } 
       onImageClick { Timber.d("Test image click") } 
       // . [email protected] 
      } 
     } 

    } else { 
     mView?.dialog_worklist_errorview?.apply { 
      visibility = View.GONE 
      setErrorDrawable(null) 
      setPrimaryText("") 
      setSecondaryText("") 
      setOnErrorMessageViewClickListener(null) 
     } 
    } 
} 

誰かが私のコードに間違いがあると示唆していますか?

Btw。上記のコードはDialogFragmentで使用されています。そのため、mViewに気づくかもしれません。少し厄介なように。しかし、それはダイアログ内のビューのハンドルを取得する方法です。

+1

ヘルパーのセットアップがよさそうだ、あなたはどこかのクラスの 'mOnClickListener'プロパティのメソッドを呼び出していますか? – zsmb13

+0

ヘルパーの入力をありがとう。 mOnclickListenerの場合、私はバーンナイフを使ってonClickイベントを処理し、mOnClickListenerメソッドをトリガしますが、何もトリガされません。私は実際のコードを表示するために質問を編集しました。 – Bohsen

+0

バターナイフは、明らかにkotlinと一緒に使用すると期待どおりに機能しません。おそらく、OnClickListenerへのバインディングを作成するための他の方法を見つける必要があります。 – Bohsen

答えて

0

最終的にソリューションを見つけたばかりの泣き始めました - OMG。

問題はここで見ることができdialogfragment、のレイアウトファイルにSwipeRefreshLayoutた:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/dialog_worklist_toolbar" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:background="@color/colorPrimary" 
     android:elevation="4dp" 
     android:minHeight="?android:attr/actionBarSize" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> 

    <com.conhea.smartgfr.ui.examination.layouts.ErrorMessageView 
     android:id="@+id/dialog_worklist_errorview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/dialog_worklist_toolbar" /> 

    <ProgressBar 
     android:id="@+id/dialog_worklist_progressbar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="gone" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toBottomOf="@id/dialog_worklist_toolbar" /> 

    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/dialog_worklist_swiperefreshlayout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     app:layout_constraintTop_toBottomOf="@id/dialog_worklist_toolbar"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/dialog_worklist_recyclerview" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@android:color/transparent" /> 
    </android.support.v4.widget.SwipeRefreshLayout> 

</android.support.constraint.ConstraintLayout> 

SwipeRefreshLayoutがクリック可能であることからカスタムErrorMessageViewをブロックしました。

すべてが仕事を始めた私のDialogFragmentに以下にmView?.dialog_worklist_swiperefreshlayout?.isEnabled = falseを追加した後:

override fun setWorklistNotEnabledMessage(showMessage: Boolean) { 
    if (showMessage) { 
     mView?.dialog_worklist_recyclerview?.visibility = View.GONE 
     mView?.dialog_worklist_swiperefreshlayout?.isEnabled = false 
     mView?.dialog_worklist_errorview?.apply { 
      visibility = View.VISIBLE 
      setErrorDrawable(R.drawable.ic_worklist_disabled_black_24dp) 
      setPrimaryText(R.string.global_worklist_disabled_error) 
      setSecondaryText(R.string.dialog_worklist_worklist_disabled_error_secondary_text) 
      setOnErrorMessageViewClickListener { 
       onSecondaryTextClick { Timber.d("Test secondary click") } 
       onPrimaryTextClick { Timber.d("Test primary click") } 
       onImageClick { Timber.d("Test image click") } 
      } 
     } 

    } else { 
     mView?.dialog_worklist_errorview?.apply { 
      visibility = View.GONE 
      setErrorDrawable(null) 
      setPrimaryText("") 
      setSecondaryText("") 
      setOnErrorMessageViewClickListener(null) 
     } 
    } 
} 
関連する問題