2017-07-22 5 views
0

私は1つのwebViewコンポーネントしか含まない1つのアクティビティ(ContactActivity.kt)を持っています。 Kotlinへのアクティビティ書き込み。Android:Kotlin:カスタムwebView - 関数として呼び出すことはできません。 'invoke()'関数が見つかりません

webViewを私のカスタムWebView(ObservableWebView.java)に置き換えたいと思います。だからここ

コード(MyActivity.kt):

class ContactActivity : AppCompatActivity() { 

     @SuppressLint("NewApi") 
     override fun onCreate(savedInstanceState: Bundle?) { 
      verticalLayout { 
    val observableWebView = object : ObservableWebView(MainApp.getAppContext()) 
      observableWebView { // error here 
        setOnLongClickListener(object : View.OnLongClickListener { 
         override fun onLongClick(v: View): Boolean { 
          return true 
         } 
        }) 
       } 
      } 
     } 
    } 

また、私は、カスタムのWebViewあり - ObservableWebView.java:

public class ObservableWebView extends WebView { 
    private OnScrollChangedCallback mOnScrollChangedCallback; 

    public ObservableWebView(final Context context) { 
     super(context); 
    } 

    public ObservableWebView(final Context context, final AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ObservableWebView(final Context context, final AttributeSet attrs, final int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) { 
     super.onScrollChanged(l, t, oldl, oldt); 
     if (mOnScrollChangedCallback != null) mOnScrollChangedCallback.onScroll(l, t); 
    } 

    public OnScrollChangedCallback getOnScrollChangedCallback() { 
     return mOnScrollChangedCallback; 
    } 

    public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback) { 
     mOnScrollChangedCallback = onScrollChangedCallback; 
    } 

    /** 
    * Impliment in the activity/fragment/view that you want to listen to the webview 
    */ 
    public static interface OnScrollChangedCallback { 
     public void onScroll(int l, int t); 
    } 
} 

をしかし、私は、エラーをコンパイルし得るMyActivity.kt

Error:(145, 13) Expression 'observableWebView' of type '<no name provided>' cannot be invoked as a function. The function 'invoke()' is not found 

答えて

1

あなたは(ドキュメントhereを参照)、このような拡張機能を使用してカスタムビューをサポートするために、あんこを拡張することができます

inline fun ViewManager.observableWebView(theme: Int = 0, init: ObservableWebView.() -> Unit): ObservableWebView { 
    return ankoView({ ObservableWebView(it) }, theme, init) 
} 

次に1を作成し、リスナーを設定すると、次のようになります。

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 

    verticalLayout { 
     observableWebView { 
      setOnLongClickListener { 
       Log.d("WEBVIEW", "on long click") 
       true 
      } 
      onLongClick { 
       Log.d("WEBVIEW", "on long click") 
      } 
     } 
    } 
} 

このコードは、長いクリックリスナーを作成する方法があまりにも異なることを示していますが、もちろん両方を必要としません。

最初の方法は古典的な方法で、WebViewsetOnLongClickListener関数を使用し、SAM conversionを使用してラムダを使用してリスナーインスタンスを作成します。ここでブール値を返す必要があります。これは、イベントを処理したかどうか、またはイベントを伝播するかどうかを示します。

onLongClickを使用して2番目の方法は、Ankoで行う方法です。 0.10.0を超えると、これはコルーチンを使用します。ここでは、ブール値を返すオプションはありません。


必要に応じて、あなたは、あなたが他の拡張機能を作成することができ、同様observableWebView()構文を使用できるようにしたい場合は、この前の拡張に委譲:

inline fun ViewManager.observableWebView() = observableWebView {} 
0

はなぜちょうど

observableWebView.setOnLongClickListener 

を呼び出していないあなたはobservableWebView上のメソッドを「呼び出す」しようとしているようですが、それは関数型ではありませんか?

関連する問題