AndroidKotlin在外部类中声明一个函数,该函数可以多次使用,但需要上下文

wj8zmpe1  于 2023-05-18  发布在  Kotlin
关注(0)|答案(3)|浏览(130)

我有下面的函数pinAppWidget,我在MainActivity中使用它,但我需要能够在ConfigurableWidgetConfigureActivity中使用它,这样我就不会有一个重复的函数,我想创建一个包含它们的类。
但我遇到了一些问题。
原始代码:

fun pinAppWidget(text: String?) {
        val urlCode = extractLinks(text)
        if (urlCode != "" && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val mAppWidgetManager = getSystemService(
                AppWidgetManager::class.java
            )

            if (!mAppWidgetManager.isRequestPinAppWidgetSupported) {
                Toast.makeText(
                    this@MainActivity,
                    "Pin app widget is not supported",
                    Toast.LENGTH_SHORT
                ).show()
                return
            }

            val myProvider = ComponentName(this@MainActivity, MyWidget::class.java)

            val pinnedWidgetCallbackIntent = Intent(this@MainActivity, MyWidget::class.java)
            val successCallback = PendingIntent.getBroadcast(
                this@MainActivity, 0,
                pinnedWidgetCallbackIntent, PendingIntent.FLAG_IMMUTABLE
            )
            mAppWidgetManager.requestPinAppWidget(myProvider, Bundle(), successCallback)
        }
    }

fun extractLinks(text: String?): String {
        val index = text!!.lastIndexOf("/")
        return text.substring(index + 1)
    }

类函数:

import android.app.Activity
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.widget.Toast

class function : Activity() {
    fun pinAppWidget(text: String?) {
        val urlCode = extractLinks(text)
        if (urlCode != "" && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val mAppWidgetManager = getSystemService(
                AppWidgetManager::class.java
            )
            if (!mAppWidgetManager.isRequestPinAppWidgetSupported) {
                Toast.makeText(
                    this@function,
                    "Pin app widget is not supported",
                    Toast.LENGTH_SHORT
                ).show()
                return
            }

            val myProvider = ComponentName(this@function, MyWidget::class.java)
            val pinnedWidgetCallbackIntent = Intent(this@function, MyWidget::class.java)
            val successCallback = PendingIntent.getBroadcast(
                this@function, 0,
                pinnedWidgetCallbackIntent, PendingIntent.FLAG_IMMUTABLE
            )
            mAppWidgetManager.requestPinAppWidget(myProvider, Bundle(), successCallback)
        }
    }

    fun extractLinks(text: String?): String {
        val index = text!!.lastIndexOf("/")
        return text.substring(index + 1)
    }

}

当我在MainActivity函数内部调用时,我会遇到以下问题:

我该怎么做,你能帮我吗?

3okqufwl

3okqufwl1#

你可以把pinAppWidget方法放到一个对象中,这样你就可以在Activity:

class function : Activity() {
    fun pinAppWidget(text: String?){}
}

//convert to
object function {
    fun pinAppWidget(text: String?, activity: Activity){}
}

另一种方法是,您可以创建BaseActivity并将pinAppWidget放入其中。然后让你的MainActivity扩展BaseActivity,你可以从这里轻松调用pinAppWidget

class BaseActivity : AppCompatActivity() {
   fun pinAppWidget (){}
}

class MainActivity : BaseActivity() {
   //call pinAppWidget()
}
cx6n0qe3

cx6n0qe32#

可以将Context对象作为参数传递给function类中的pinAppWidget函数。

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.widget.Toast

class MyWidgetFunction {
    fun pinAppWidget(context: Context, text: String?) {
        val urlCode = extractLinks(text)
        if (urlCode != "" && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val mAppWidgetManager = context.getSystemService(
                AppWidgetManager::class.java
            )
            // Rest of your code...
        }
    }

    private fun extractLinks(text: String?): String {
        val index = text!!.lastIndexOf("/")
        return text.substring(index + 1)
    }
}

现在您可以在MainActivityConfigurableWidgetConfigureActivity中使用MyWidgetFunction类。调用pinAppWidget函数时,请确保传递适当的Context对象。
MainActivity中:

val myWidgetFunction = MyWidgetFunction()
myWidgetFunction.pinAppWidget(this, text)

ConfigurableWidgetConfigureActivity中:

val myWidgetFunction = MyWidgetFunction()
myWidgetFunction.pinAppWidget(this, text)

注意:确保将MyWidget替换为小部件类的实际名称。

qhhrdooz

qhhrdooz3#

这个问题至少包括两件事:架构决策和Android平台限制。
从软件架构的Angular 来看,您可以:

  • 创建一个公共父类,并将this和rest公共逻辑放在其中;其他活动将扩展该类并继承其行为。
  • 创建实用程序类来封装公共逻辑,并在每个活动中示例化该类。
  • 内部类(在Kotlin中也称为object:)可以是这两个选项的替代方案。
  • kotlin还提供了扩展,这可能是实现任务的第四种方式。

从Android平台的Angular 来看,组件代码只能从组件(Activity、Service、BroadcastReceiver、ContentProvder)调用。你的函数使用组件代码(mAppWidgetManager.requestPinAppWidget(...)),最好将其保留在组件中而不要放在外部。尽管如此,仍然可以将其放入一个单独的类中,并传递context来运行此代码。

相关问题