web-dev-qa-db-ja.com

Kotlinクラスからメソッドを呼び出す

ツールバーのタイトルを設定し、フラグメントに応じてツールバーを非表示または表示するutil Kotlinクラスがあります。

_class MyToolbarUtils() {

    fun hideToolbar(activity: Activity) {
        (activity as MainActivity).supportActionBar!!.hide()
    }

    fun showToolbar(activity: Activity, tag: String) {
        setToolbarTitle(tag, activity)
        (activity as MainActivity).supportActionBar!!.show()
    }

    fun setToolbarTitle(tag: String, activity: Activity) {
        var title = ""
        when (tag) {
            "Main_fragment" -> title = activity.resources.getString(R.string.Main_screen)
            "Add_note" -> title = activity.resources.getString(R.string.Add_note)
        }
        activity.title = title
    }
}
_

フラグメントからshowToolbar(...)を呼び出す方法? MyToolbarUtils.showToolbar(..)を試しましたが、それは不可能です

私が発見する唯一の方法は:

_val setToolbarTitle = MyToolbarUtils()
setToolbarTitle.showToolbar(activity, tag)
_

しかし、それを行うためのより良い方法がなければなりません。

8
Stepan

classを、=と同様に機能するはずのobjectに変換しますJava静的メソッド。

あなたはここでより多くの情報を得ることができます: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations

12
ilya.dorofeev

MyToolbarUtilsのようなサウンドは、クラスではなく オブジェクト宣言 である必要があります。

もう1つの方法は、ファイル内のトップレベルでこのクラス内の関数を宣言し(クラス内ではなく)、単純な名前でそれらを参照することです。

4

他の人は、関数を静的メソッドのように感じる方法に答えましたが、このユースケースには、より慣用的なオプションがあります。

Kotlinの拡張関数は、Javaの静的ユーティリティクラスを置き換えます:

allの関数はActivityをパラメーターとして取るので、なぜ extension functions を使用しないでください代わりにActivityまたはMainActivityクラスを拡張しますか?

fun MainActivity.hideToolbar() {
    supportActionBar!!.hide()
}

fun MainActivity.showToolbar(tag: String) {
    setToolbarTitle(tag)
    supportActionBar!!.show()
}

fun Activity.setToolbarTitle(tag: String) {
    title = when (tag) {
        "Main_fragment" -> title = resources.getString(R.string.Main_screen)
        "Add_note" -> title = resources.getString(R.string.Add_note)
        else -> "" // or did you mean this to be an exception?
    }
}

現在、それらはすべてMainActivityまたはActivityクラスのコンテキストにあります(thisはこれらのいずれかのインスタンスになりました)。それらを探す必要はありません。他の無関係なActivityUtilsクラス内。あなたが活動クラスの中にいるときはいつでも、あなたは簡単にできます:

showToolbar("Main_fragment")

またはアクティビティへの参照がある他の場所から:

// you have a reference of MainActivity type
myMainActivity.showToolbar("Main_fragment")

// you have a reference you can cast to MainActivity type
(someActivity as MainActivity).showToolbar("Main_fragment")

// this function works with any Activity
someActivity.setToolbarTitle("Add_note")

また、コードを少しクリーンアップし、 whenを式として を使用してタイトルを設定し、varを削除したことにも注意してください(これはまれですvarが必要なので、常にvalでの作業方法を考えてください。また、式としてwhenにはelse句が必要になるため、デフォルトの""空文字列と同じにしました。

クラスメソッドとしての代替:

3つのメソッドはすべて、(キャストに基づいて)MainActivityのインスタンスを必要とするので、それらをメンバー関数としてMainActivityに入れてみませんか。

class MainActivity ... {
    ...

    fun hideToolbar() {
        supportActionBar!!.hide()
    }

    fun showToolbar(tag: String) {
        setToolbarTitle(tag)
        supportActionBar!!.show()
    }

    fun setToolbarTitle(tag: String) {
        title = when (tag) {
            "Main_fragment" -> title = resources.getString(R.string.Main_screen)
            "Add_note" -> title = resources.getString(R.string.Add_note)
            else -> "" // or did you mean this to be an exception?
        }
    }
}

そして、MainActivityへの参照からそれらを呼び出します。

オブジェクト宣言としての代替:

最後に、他の人が提案したように、完全を期すために、これらはstaticsと同様に機能するユーティリティクラスにありますが、代わりにシングルトンのメソッド オブジェクト宣言

object MyToolbarUtils() {
    fun hideToolbar(activity: MainActivity) {
        activity.supportActionBar!!.hide()
    }

    fun showToolbar(activity: MainActivity, tag: String) {
        setToolbarTitle(activity, tag)
        activity.supportActionBar!!.show()
    }

    fun setToolbarTitle(activity: Activity, tag: String) {
        activity.title = when (tag) {
            "Main_fragment" -> title = resources.getString(R.string.Main_screen)
            "Add_note" -> title = resources.getString(R.string.Add_note)
            else -> "" // or did you mean this to be an exception?
        }
    }
}

しかし、これは別のクラスの機能を拡張するための最悪で最もKotlinに似た方法だと思います。静的なSomethingUtilsのようなクラス/オブジェクトは、おそらく extension functions を代わりに記述する必要があることを意味します。

2
Jayson Minard

Objectキーワードを使用してKotlinでシングルトンクラスを作成し、Javaで以下のようにKotlinシングルトンクラスを呼び出します。

object SampleSingleton {
   fun someMethod() { 
     println("I love coding")
   }
}

Javaの場合、次のようになります。

public static void main(String args[]) {
   SampleSingleton.INSTANCE.someMethod();
}

または次のようにKotlinクラスから

SampleSingleton.someMethod()
0
Alok Gupta