当前位置: 首页 > 知识库问答 >
问题:

IllegalStateException: RecyclerView 在 NavigationDrawer 活動中的 Fragment 內部為 null

扶誉
2023-03-14

我试图制作一个RecyclizerView,它将进入我的片段的两页之一。这些页面放在 NavigationDrawer 活动中。目标是创建类似于Play商店应用首页的内容。

但是我在运行时的这段代码中发现了一个错误。上面写着:

java.lang.IllegalStateException: mainMenu must not be null
    at com.example.MyApp.app.fragment.MainFragment.onCreate(MainFragment.kt:49)

我一直在看一些SO线程,他们说布局没有正确加载。这导致一些元素没有按预期链接。另一位在评论中说,问题在于上下文未正确初始化。对我来说情况并非如此(而是RecyclizerView)。

下面是相关链接,希望对大家有参考价值。

  • TextView不能为空
  • 上下文不能为空

在多次检查我的代码后,我发誓我已经把正确的布局放进去了。编辑:我导入了kotlinx.android.synthetic.main.^包,在那里我放了这个标志:^${layout}.以下是我的一些文件(如果这个帖子太长,请原谅):

>

  • main活动。kt:appcompativity()^activity_main*

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // preparing the app bars
            setSupportActionBar(toolBar)
    
            // getting ready for the pages
            val pagerAdapter = MainPagerAdapter(
                    supportFragmentManager,
                    resources.getString(R.string.tab_main),
                    resources.getString(R.string.tab_chat)
            )
            pager.adapter = pagerAdapter
    
            // activating tabs
            tabLayout.setupWithViewPager(pager)
    
            val toggle = ActionBarDrawerToggle(
                    this, mainDrawer, toolbar,
                    R.string.navigation_drawer_open,
                    R.string.navigation_drawer_close)
    
            mainDrawer.addDrawerListener(toggle)
    
    
            navView.setNavigationItemSelectedListener(this)
            toggle.syncState()
    
    }
    

    MainPagerAdapter.kt (fm: FragmentManager, private val page1: String, private val page2: String): FragmentPagerAdapter(fm)

    override fun getItem(position: Int): Fragment? {
        return when (position) {
            0 -> MainFragment()
            1 -> ChatFragment()
            else -> null
        }
    }
    
    override fun getCount() = 2
    
    override fun getPageTitle(position: Int): CharSequence? {
        return when (position) {
            0 -> page1
            1 -> page2
            else -> null
        }
    }
    

    < code > mainfragment . kt:fragment() ^content_main.*

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?)
        : View? = inflater.inflate(R.layout.content_main, container)
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        // this is the error
        mainMenu.layoutManager = LinearLayoutManager(this.context)
    
        mainMenu.adapter = MyAdapter(itemList) {
            toast("${it.name} selected")
        }
    }
    

    MyAdapter.kt: RecyclerView.Adapter

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
        = GoodsHolder(parent.inflate(R.layout.item_custom))
    
    override fun getItemCount()
        = itemList.size
    
    override fun onBindViewHolder(holder: MyHolder, position: Int)
        = holder.bind(itemList[position], listener)
    
    
    class MyHolder(v: View): RecyclerView.ViewHolder(v){
        private val item: Item? = null
        private val view = v
    
        fun bind(item: Item, listener: (Item) -> Unit)
                = with (itemView) {
            imgPic.setImageResource(item.pictureId)
            txtName.text = item.name
            txtPrice.text = item.price.toString()
    
        setOnClickListener { listener(item) }
        }
    }
    

    content_main.xml

    <android.support.constraint.ConstraintLayout
        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:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="com.example.MyApp.app.activity.MainActivity"
        >
    
        <!-- the RecyclerView that caused the runtime error -->
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/mainMenu"/>
    
    </android.support.constraint.ConstraintLayout>
    

    item_custom.xml(这些代码位于 CardView 内的 LinearLayout 中)

    <ImageView
        android:id="@+id/imgPic"
        android:layout_width="match_parent"
        android:layout_height="128dp"
        app:srcCompat="@drawable/ic_menu_gallery" />
    
    <TextView
        android:id="@+id/txtName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Get it while it's hot!"
        android:layout_margin="@dimen/margin_small"
        android:layout_marginTop="@dimen/margin_medium"
        android:maxLines="2"
        android:ellipsize="end"
        android:textStyle="bold"
        />
    
    <TextView
        android:id="@+id/txtPrice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="$3.000.000"
        android:layout_marginLeft="@dimen/margin_small"
        android:layout_marginStart="@dimen/margin_small"
        android:layout_marginRight="@dimen/margin_small"
        android:layout_marginEnd="@dimen/margin_small"
        android:layout_marginBottom="@dimen/margin_medium"/>
    

    聊天片段。kt:Fragment()

    content_main_chat.xml(仅包含文本视图)


  • 共有3个答案

    百里俭
    2023-03-14

    由于您使用的是kotlin,因此您可以使用合成材料,而无需执行var.rv_frag_wiki=listItems.findViewById

    而是通过插件步骤1导入合成材料:

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    

    步骤 2 :

    在MainFraank中导入合成

    < code >导入kot linx . Android . synthetic . main . content _ menu。* //

    第三步:

    最后在MainFraank中

    将recyclerView的代码移到此处

     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            rvList.layoutManager = LinearLayoutManager(context, 
            LinearLayoutManager.VERTICAL, false)
            rvList.adapter = academyAdapter
    
        }
    
    云浩然
    2023-03-14

    对于任何遵循@Avijit Karmakar的精彩线索,参与另一场讨论的人,(RecyclerView错误:未连接适配器;跳过布局),我必须包括:

    class WikiFragment : Fragment() {
        val paginas: ArrayList<String> = ArrayList()    
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                  savedInstanceState: Bundle?): View? {
    var listItems : View  = inflater.inflate(R.layout.fragment_wiki, container, false)
    
    var rv_frag_wiki = listItems.findViewById<View>(R.id.rv_frag_wiki) as RecyclerView
    
    
     rv_frag_wiki.layoutManager = LinearLayoutManager(this.context)
            rv_frag_wiki.adapter = PaginasAdapter(paginas, this.context)
            
      return listItems 
      
    翟泰
    2023-03-14

    您还没有在MainFragment.kt文件中初始化RecyclView。您必须在以下行之前初始化它:

    mainMenu.layoutManager = LinearLayoutManager(this.context)
    

    您可以通过以下代码行初始化RecyclerView:

    var mainMenu = findViewById(R.id.mainMenu) as RecyclerView
    

    你必须根据你的需要来改变它。

     类似资料:
    • 我知道这个问题很常见,但我真的很困惑如何将onClickListener应用到我的navigationDrawer项目中,我有两个项目,即编辑配置文件和注销。如果选择了其中一个项目,我只想进行Toast或打印。是否有人可以帮助我,我已经在互联网上搜索过了,但还没有找到onClickListener,需要帮助 我想我的主活动中缺少了一个 OnCreate()主活动 侧菜单。xml sidebar_h

    • 我用这个教程来实现facebook登录等。 Facebook登录 我在这里添加了新的片段来显示朋友列表。现在,当我在新添加的片段上按下后退按钮时,它会把我带到SPLASH片段,我想要动作栏上同样的后退按钮行为。这意味着当我在我的新片段上时,它会在动作栏上显示一个后退按钮。按下后退按钮会把我带回SPLASH屏幕。

    • 对于在DrawerLayout中使用RecolyerView还是ListView我有点困惑。 我读了一篇教程,其中解释了如何使用RecolyerView创建NavigationDrawer。 根据Google的说法:RecolyerView是 1)用于显示大型数据集的容器,通过维护有限数量的视图可以非常高效地滚动这些数据集。 2)在内部使用了一个布局管理器。布局管理器将项视图放置在Recycler

    • 我有一个应用程序相当多的活动之前,它决定我们将使用导航抽屉或汉堡包菜单。我不想使用片段重做整个应用程序,所以我决定采用这个答案中使用的方法:在不同的活动中使用相同的导航抽屉 编辑:现在,这一个https://stackoverflow.com/a/23477100/1371585 并且创建了一个名为的基本活动。代码如下: 下面是布局文件 每个活动都扩展了,而不使用,如下所示: 我的问题:如何正确地

    • 我有一个受支持的片段活动,它将加载差异片段。片段有一些,带有我想得到它的句柄,但score的

    • 我正试图添加一个映射到片段中,我在IDE中没有错误的迹象,但应用程序只是在设备中崩溃了。我不知道发生了什么。我已经在控制台中为Android启用了地图SDK,我所做的只是将Android Studio生成的MapsActivity修改为MapsFragment。 mapsfragment.kt fragment_maps.xml 我得到的只是这个错误。