如何通过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)
我需要知道如何在 "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)