Ошибка: не найден вид для библиотеки настроек androidx (Jetpack) - PullRequest
0 голосов
/ 25 января 2019

Я следовал инструкциям на документах , чтобы использовать библиотеку настроек Android Jetpack, но я получаю следующую ошибку

java.lang.RuntimeException: Unable to start activity ComponentInfo{ ... activity.SettingsActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f090111 (... :id/settings_container) for fragment SettingsFragment
...
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f090111 (... :id/settings_container) for fragment SettingsFragment 

как я думаю, это обычно происходит, когда нет контейнера для монтирования фрагмента, но в моем случае есть контейнер (settings_container).

Мой код выглядит ниже

SettingsActivity

class SettingsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings_container, SettingsFragment())
            .commit()
    }
}

SettingsFragment

class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

    setPreferencesFromResource(R.xml.pref_main, rootKey)
}

activity_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/settings_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".activities.SettingsActivity">
</FrameLayout>

pref_main.xml (сокращенно)

<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android">

 <PreferenceCategory
            app:key="data_sync_category"
            app:title="@string/pref_data_sync_category">

        <SwitchPreferenceCompat app:key="data_sync_status"
                                app:title="@string/pref_data_sync_status_title"
                                app:summary="@string/pref_data_sync_status_summary"
                                android:defaultValue="true"
        />
        <ListPreference app:key="what_data_sync"
                        app:title="@string/pref_sync_frequency_title"
                        app:summary="@string/pref_sync_frequency_summary"
                        android:entries="@array/pref_sync_frequency_titles"
                        android:entryValues="@array/pref_sync_frequency_values"
                        android:defaultValue="30"
                        android:negativeButtonText="@null"
                        android:positiveButtonText="@null"
        />
    </PreferenceCategory>
</androidx.preference.PreferenceScreen>

Как видите, код практически идентичен коду в документации. Я пытался сделать недействительным и перезагрузить, не работает.

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 25 января 2019
java.lang.RuntimeException: Unable to start activity ComponentInfo{ ... activity.SettingsActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f090111 (... :id/settings_container) for fragment SettingsFragment
...
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f090111 (... :id/settings_container) for fragment SettingsFragment

в соответствии с вашим кодом вы не установили макет для действия

вы даете ссылку на settings_container, но она не найдена в макете активности, потому что у них нет файла макета, поэтому вам нужно setContentView для вашей деятельности


setContentView(R.layout.name)

public void setContentView (int layoutResID)

Установите содержание деятельности из ресурса макета.Ресурс будет раздут, добавив в представление все представления верхнего уровня.


Замените ваш файл kt действия на

class SettingsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings_container, SettingsFragment())
            .commit()
    }
}
0 голосов
/ 25 января 2019

Нет, контейнера нет.

Вы никогда не используете setContentView() в своей деятельности, поэтому макет не существует.tools:context является функцией только для IDE.

Вам необходимо использовать

setContentView(R.layout.activity_settings)

сразу после вызова super.onCreate(savedInstanceState).

...