Как найти ListView из неактивного класса с Kotlin? - PullRequest
0 голосов
/ 19 сентября 2018

В моем MainActivity, если я импортирую:

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

, я могу просто найти свой ListView и установить onItemClickListener так:

list_view.onItemClickListener

Но как можноЯ делаю то же самое в классе бездействия?

Редактировать:

fun setListViewElements() {
    list_view.adapter = arrayAdapter
    list_view.onItemClickListener = AdapterView.OnItemClickListener {}
}

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Вы можете передать listView как constuctor аргумент вашего класса следующим образом:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView = findViewById(R.id.listview);

        ClassExample classExample = new ClassExample(listView);

    }

И:

class ClassExample {

        ListView listView;
        public ClassExample(ListView listView){
            this.listView = listView;
        }

    }

Надеюсь, это поможет

0 голосов
/ 19 сентября 2018

Вы можете получить доступ к представлениям без findViewById, используя плагин kotlin-android-extensions и интерфейс LayoutContainer.

В своем файле build.gradle убедитесь, что вы применили плагин и установили экспериментальный флаг:

apply plugin: 'kotlin-android-extensions'

androidExtensions {
    experimental = true
}

Класс, из которого вы хотите получить доступ к list_view, должен реализовывать интерфейс LayoutContainer.Реализация этого интерфейса означает, что вам нужно предоставить контейнерное представление, в котором можно найти ваш ListView.

Теперь давайте предположим, что у нас есть простой макет, который мы используем для MainActivity:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

В нашем MainActivity мы используем этот файл с setContentView.

Теперь вы можете написать класс, который не является действием, но может использовать представление (TextView в этом примере) без использования findViewById:

package com.example.playground

import android.view.View
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_main.*

class Demo(override val containerView: View?) : LayoutContainer {

    fun setTextViewText(text: String) {
        text_view.text = text
    }

}

Класс реализует LayoutContainer (это возможно только при первом включении экспериментальных функций) и, следовательно, должен предоставить свойство containerView, которое он получает черезКонструктор.

Теперь, чтобы использовать этот класс, например, из действия, вам нужно создать его экземпляр и дать ему представление, в котором существует text_view (LinearLayout с идентификатором container в моем случае):

val demo = Demo(container)
demo.setTextViewText("Magic!")

Вы не сможете использовать kotlinx.android.synthetic -магию без предоставления контейнера.Потому что в основном то, что происходит в фоновом режиме, это то, что если вы получаете доступ к list_view, расширение делает findViewById.

Online, вы можете найти дополнительную информацию из Kotlin о плагине Android и о как использовать расширения Android .

0 голосов
/ 19 сентября 2018

Как сказано здесь ;

Вы должны передать ссылку на контекст через конструктор.

public class ClassB {
   Context context;
   public ClassB(Context context){
     this.context=context;
   }

   public void Update(){
        TextView txtView = (TextView) ((Activity)context).findViewById(R.id.text);
        txtView.setText("Hello");
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...