【问题标题】:Problem with "No View Found.." when working with Settings Preference使用“设置首选项”时出现“未找到视图..”的问题
【发布时间】:2020-11-08 18:49:53
【问题描述】:

这里是新手开发者。 尝试使用 SharedPreference 和 Settings Options 来学习。我正面临错误消息,其中 View No found for fragment。

这是我与问题相关的代码;我一直在通过这个网站检查类似的问题,但我的知识对于解决问题非常基础。 提前感谢您的 cmets!

在我的活动中;

override fun onOptionsItemSelected(item: MenuItem): Boolean {
   val id = item.itemId
   when (id) {
       R.id.action_settings -> {

           supportFragmentManager
               .beginTransaction()
              .replace(R.id.action_settings, MySettingsFragment())
               .commit()
       }
       else -> return super.onOptionsItemSelected(item)
   }
       return super.onOptionsItemSelected(item)
   }

我的设置片段

package com.khaxapplication.rfid_api_zebra.utilities

import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat
import com.khaxapplication.rfid_api_zebra.R
class MySettingsFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

fragment_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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".utilities.MySettingsFragment">

</FrameLayout>

得到错误信息

2020-11-08 19:35:55.979 20322-20322/com.khaxapplication.rfid_api_zebra E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.khaxapplication.rfid_api_zebra, PID: 20322
    java.lang.IllegalArgumentException: No view found for id 0x7f080041 (com.khaxapplication.rfid_api_zebra:id/action_settings) for fragment MySettingsFragment{8621cad} (9e68a7a2-fa38-432f-b3f2-e368c60dae30) id=0x7f080041}
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:315)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
        at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7050)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
2020-11-08 19:35:56.010 20322-20322/com.khaxapplication.rfid_api_zebra I/Process: Sending signal. PID: 20322 SIG: 9

添加完整的 MainActivity.class

package com.khaxapplication.rfid_api_zebra

import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.navigation.NavigationView
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import androidx.drawerlayout.widget.DrawerLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import com.khaxapplication.rfid_api_zebra.utilities.MySettingsFragment

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        val fab: FloatingActionButton = findViewById(R.id.fab)
        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }
        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(setOf(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow), drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
     }


    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val id = item.itemId
    when (id) {
        R.id.action_settings -> {

            supportFragmentManager
                .beginTransaction()
               .replace(R.id.action_settings, MySettingsFragment())
                .commit()
        }
        else -> return super.onOptionsItemSelected(item)
    }
        return super.onOptionsItemSelected(item)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.nav_host_fragment)
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }


}

activity_main.xml 的布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
</androidx.drawerlayout.widget.DrawerLayout>

【问题讨论】:

    标签: kotlin sharedpreferences settings


    【解决方案1】:

    无论您为 Activity 使用什么布局,都没有 ID 为“action_settings”的视图。

    如果“fragment_settings.xml”是您用于活动的内容,则需要为 FrameLayout 提供一个 ID 属性。

    由于R.id.action_settings 存在,您必须在某个布局文件中包含它。也许您在活动中应用了错误的布局。

    【讨论】:

    • 嗨 Tenfour04。非常感谢您的快速回复。我更新了主要活动及其布局的完整课程。如您所见,这是一个使用抽屉菜单时 Android Studio 的简单启动演示示例。 MainActivity 的布局已上传。我确实在关注这个例子。 developer.android.com/guide/topics/ui/settings
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2023-03-31
    • 2020-07-17
    • 2020-04-09
    • 2021-07-12
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多