Преобразовать findViewById из Java в Kotlin - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь преобразовать этот кусок кода из Java:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.main_fragment, container, false);
    genre[0] = view.findViewById(R.id.MovieGenre);
    genre[1] = view.findViewById(R.id.MovieGenre2);
    genre[2] = view.findViewById(R.id.MovieGenre3);
    recyclerView[0] = view.findViewById(R.id.rc_view);
    recyclerView[1] = view.findViewById(R.id.rc_view2);
    recyclerView[2] = view.findViewById(R.id.rc_view3);

    if (movieList.size()==0) loadMovie();
    else refreshList();

    return view;
}

в Kotlin:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    view = inflater.inflate(R.layout.main_fragment, container, false) as Nothing?
    genre[0] = this.view.findViewById(R.id.MovieGenre)
    genre[1] = this.view.findViewById(R.id.MovieGenre2)
    genre[2] = view.findViewById(R.id.MovieGenre3)
    recyclerView[0] = view.findViewById(R.id.rc_view)
    recyclerView[1] = view.findViewById(R.id.rc_view2)
    recyclerView[2] = view.findViewById(R.id.rc_view3)

    if (movieList.size == 0) loadMovie() else refreshList()
    return view
}

Проблема в том, что компилятор не распознает findViewById. Как я могу назначить представление переработчика в моем xml каждой переменной?

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Пара изменений будет работать, я думаю.

Удалить as Nothing? из

view = inflater.inflate(R.layout.main_fragment, container, false) as Nothing?

Это может быть ненужным.

Я не понимаю, что вы здесь вы пытаетесь добиться инициализации, например genre[0], genre[1] ..

genre[0] = this.view.findViewById(R.id.MovieGenre)
genre[1] = this.view.findViewById(R.id.MovieGenre2)
genre[2] = view.findViewById(R.id.MovieGenre3)
recyclerView[0] = view.findViewById(R.id.rc_view)
recyclerView[1] = view.findViewById(R.id.rc_view2)
recyclerView[2] = view.findViewById(R.id.rc_view3)

, вместо этого вы можете попробовать, как показано ниже

val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)

или

val recycler_view: RecyclerView = findViewById(R.id.recycler_view)

, или вы можете попробуйте функции расширения, как указано в ответе @TemaTre.

или , вы можете использовать anko library

EDIT

Анко устарела см.

1 голос
/ 16 марта 2020

В соответствии с этим https://antonioleiva.com/kotlin-android-extensions/ Вам не понадобился метод "findViewById". В настоящее время вы можете использовать имя в качестве поля класса. Например,

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/welcomeMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello World!"/>

</FrameLayout>

И теперь вы можете использовать welcomeMessage вот так

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

    welcomeMessage.text = "Hello Kotlin!"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...