Как получить ProgressBar (или кнопку ...) в класс в Android через Koltin? - PullRequest
0 голосов
/ 25 февраля 2019

Мне нужно знать, как вызывать ProgressBar (или любую другую кнопку) в классе, вне метода "onCreate".Я видел в Java, что я могу сделать это, вызывая findViewById (), но в Kotlin от него избавились.Например, я пробовал что-то вроде этого:

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

Но это дает мне неразрешенную ссылку для метода поиска.

Заранее спасибо за помощь

______________ ОБНОВЛЕНИЕ ________________

Вот мой пользовательский класс DownloadManager

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 __________

Я обработал код и обнаружил несколько проблем, которыезвучит очень "странно" для меня:

1) чтобы остановить исключение нулевой точки относительно значения myProgressBar.progress =, я обнаружил, что должен инициализировать myProgressBar.progress = 0

2) с println() моя нить втирается в журнал точно, шаг за шагом, количество загруженных файлов, но если я добавлю myProgressBar.progress = progress.toInt () (прогресс - это то же самое, что я проштампую в println ()!)в теме ... он начинает работать асинхронно так, как ДАЖЕ НАЧИНАЕТСЯ ПЕРЕД началом загрузки .. что приводит к нескольким ошибкам и множественным загрузкам "

союзник не знает, что происходит

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

добавить следующую строку в 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.

0 голосов
/ 25 февраля 2019

findViewById теперь возвращает универсальный тип, который расширяет View ( документы) .

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

Вы можете использовать

val progressBar = findViewById<ProgressBar>(R.id.myProgressBar)
0 голосов
/ 25 февраля 2019

Во-первых, в Kotlin все работает точно так же.

Но в Kotlin есть лучший путь:

Добавьте следующую строку в ваши приложения build.gradle: apply plugin: 'kotlin-android-extensions'

Теперь вы можете получить доступ к представлению по его идентификатору:

например, myProgressBar.progress = 30

Подробнее: https://kotlinlang.org/docs/tutorials/android-plugin.html

...