如何通过kotlin将进度条(或按钮......)放入android中的class?

How to get a ProgressBar (or a button...) into class in android through koltin?

我需要知道如何在 "onCreate" 方法之外将 ProgressBar(或任何其他类型的按钮)调用到 class 中。 我在 Java 中看到我可以调用 findViewById(),但是它在 Kotlin 中已被删除。 例如我正在尝试这样的事情:

 var myProgressBar = findViewById(R.id.myProgressBar) as ProgressBar

但它为我提供了查找视图方法的未解决参考。

在此先感谢您的帮助

______________UPDATE____________________

这是我的 DownloadManager 自定义 class

class DownloadSoundController(context: Context): Activity() {

val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
.....
.....
      Thread(Runnable{
        while (starter) {
            var query = DownloadManager.Query()
            query.setFilterById(refid)
            var c = downloadManager.query(query)

            if (c.moveToFirst()) {
                var totalSizeIndex = c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)
                var downloadedIndex = c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)
                val fileSize = c.getLong(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))
                var totalSize = c.getInt(totalSizeIndex)
                var downloaded = c.getInt(downloadedIndex)
                var progress = 0.0
                var raffronto: Long = -1

                if (fileSize != raffronto) {
                    progress = downloaded * 100.0 / totalSize
                    //println("myTag - downloaded % :$progress, downloaded var: $downloaded")
                    myProgressBar.progress = progress.toInt()
                    if (progress == 100.0) {
                        starter = false
                    }
                } else {
                    //println("myTag - downloaded = 100 progress: $progress, $downloaded")
                    myProgressBar.progress = progress.toInt()
                    if (progress == 100.0) {
                        starter = false
                    }
                }
            }
        }
    }).start()

这是我的清单:

<application
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

    <activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="fullSensor"
            tools:replace="screenOrientation" />

    <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
//ATTENTION
   <activity android:name="com.example.myapplication.DownloadSoundController"/> 
// here it returns ERROR, on default constructor

    <receiver android:name=".DownloadBroadcastManager">
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
        </intent-filter>
    </receiver>

</application>

_________UPDATE_2__________

我完善了代码,发现了几个对我来说确实 "weird" 的问题:

1) 停止关于 myProgressBar.progress = 值的空点异常,我发现我必须初始化 myProgressBar.progress = 0

2) 使用 println(),我的线程会在日志中准确地标记我的文件的下载量,但是如果我添加 myProgressBar.progress = progress.toInt() (进度var 是相同的我在线程中标记 println()!)...它开始异步,甚至在下载开始之前就开始了...导致几个错误和 multiple 下载

真不知道怎么回事

首先,它在 Kotlin 中的工作方式相同。

但 Kotlin 中有更好的方法:

将以下行添加到您的应用程序 build.gradle: apply plugin: 'kotlin-android-extensions'

现在,您可以通过 id 访问视图:

例如myProgressBar.progress = 30

更多:https://kotlinlang.org/docs/tutorials/android-plugin.html

将以下行添加到 build.gradle:apply plugin: 'kotlin-android-extensions

import kotlinx.android.synthetic.main.activity_main.*

class MyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Instead of findViewById<TextView>(R.id.textView)
        textView.setText("Hello, world!")
    }
}

这也可以在 onCreate 之外完成。

findViewById 现在 returns 一个扩展 View 的泛型类型(docs).

final <T extends View> T findViewById(...)

您可以使用

val progressBar = findViewById<ProgressBar>(R.id.myProgressBar)