ツールバーのタイトルを設定し、フラグメントに応じてツールバーを非表示または表示する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)
_
しかし、それを行うためのより良い方法がなければなりません。
classを、=と同様に機能するはずのobjectに変換しますJava静的メソッド。
あなたはここでより多くの情報を得ることができます: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations
MyToolbarUtils
のようなサウンドは、クラスではなく オブジェクト宣言 である必要があります。
もう1つの方法は、ファイル内のトップレベルでこのクラス内の関数を宣言し(クラス内ではなく)、単純な名前でそれらを参照することです。
他の人は、関数を静的メソッドのように感じる方法に答えましたが、このユースケースには、より慣用的なオプションがあります。
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 を代わりに記述する必要があることを意味します。
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()