Android Kotlin:在 Fragment 下带有 Intent 的 setOnClickListener

Posted

技术标签:

【中文标题】Android Kotlin:在 Fragment 下带有 Intent 的 setOnClickListener【英文标题】:Android Kotlin: setOnClickListener with Intent under Fragment 【发布时间】:2020-09-05 03:06:50 【问题描述】:

我正在尝试在 Fragment 下创建带有 Intent 的 setOnClickListener,但是当我尝试使用以下方法实例化 Intent 对象时出现以下错误:

    US.setOnClickListener 

        var intent = Intent(this, US_Fragment::class.java)
        startActivity(intent)
    

错误信息: 不能使用提供的参数调用以下函数。 (Context!, Class!) 在 android.content.Intent 中定义 (String!, Uri!) 在 android.content.Intent 中定义

我希望我的 NewsFragment.kt 在点击 android:id="@+id/US" 时跳转到 US_Fragment.kt。

非常感谢。

NewsFragment.kt

import kotlinx.android.synthetic.main.fragment_news.*

class NewsFragment : Fragment() 
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        arguments?.let 
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        

        US.setOnClickListener 

            var intent = Intent(this, US_Fragment::class.java)
            startActivity(intent)
        
    

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 

        ///val view = inflater.inflate(R.layout.fragment_news, container, false)
        ///view.recyclerView_news.layoutManager = LinearLayoutManager(activity)
        ///view.recyclerView_news.adapter = MainAdapter()

        ///return view

    


    companion object 
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            NewsFragment().apply 
                arguments = Bundle().apply 
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                
            
    



fragment_news.kt

<FrameLayout 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_
    android:layout_
    tools:context="view.NewsFragment">

    <!-- TODO: Update blank fragment layout -->


    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        android:layout_>


        <Button
            android:id="@+id/US"
            android:layout_
            android:layout_
            android:text="North Americas"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/EMEA"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/EMEA"
            android:layout_
            android:layout_
            android:text="EMEA"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/US" />

        <Button
            android:id="@+id/ASIA"
            android:layout_
            android:layout_
            android:text="ASIA"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/EMEA" />

    </androidx.constraintlayout.widget.ConstraintLayout>


</FrameLayout>

FragmentNews.kt(已编辑)

class NewsFragment : Fragment() 
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        arguments?.let 
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        

        US.setOnClickListener 

            var intent = Intent(requireContext(), US_Fragment::class.java)
            startActivity(intent)
        
    

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 

        return inflater.inflate(R.layout.fragment_us, container, false)

    


    companion object 
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            NewsFragment().apply 
                arguments = Bundle().apply 
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                
            
    



Logcat 错误:

2020-05-19 16:53:06.264 21495-21495/? E/e.myapplicatio: Unknown bits set in runtime_flags: 0x8000
2020-05-19 16:53:10.706 21495-21495/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 21495
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at view.NewsFragment.onCreate(NewsFragment.kt:35)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1175)
        at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1255)
        at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1138)
        at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1989)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
        at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1818)
        at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:303)
        at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:246)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
        at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:669)
        at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:631)
        at androidx.viewpager.widget.ViewPager.setCurrentItem(ViewPager.java:612)
        at com.google.android.material.tabs.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2831)
        at com.google.android.material.tabs.TabLayout.dispatchTabSelected(TabLayout.java:1608)
        at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1601)
        at com.google.android.material.tabs.TabLayout.selectTab(TabLayout.java:1569)
        at com.google.android.material.tabs.TabLayout$Tab.select(TabLayout.java:1874)
        at com.google.android.material.tabs.TabLayout$TabView.performClick(TabLayout.java:2059)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

【问题讨论】:

【参考方案1】:

这应该可以工作

US.setOnClickListener 
        var intent = Intent(applicationContext, US_Fragment::class.java)
        startActivity(intent)

【讨论】:

好的,我不再收到错误消息,但程序崩溃了。我怀疑这是因为我的 onCreateView 函数没有返回任何内容。我需要写什么来防止它崩溃?谢谢。 这是我写的但是崩溃了。覆盖 fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? return inflater.inflate(R.layout.fragment_us, container, false) 您确定按钮的布局与您正在显示的布局相同吗?错误是一个空指针,意味着应用程序正在寻找不存在的东西。您可以尝试将其包装在 try-catch 语句中。这应该可以防止应用崩溃 谢谢Kaedin,NewsFragment.kt 和US_Fragment.kt 位于app->java->view fragment_news.xml 和fragment_us.xml 位于app->res->layout 下这样不合适吗?让我暂时将 try-catch 处理作为一种解决方法。非常感谢。【参考方案2】:

替换您的 OnClickListener 代码

 US.setOnClickListener 
            var intent = Intent(this, US_Fragment::class.java)
            startActivity(intent)
        

使用以下代码:

US.setOnClickListener 

    var intent = Intent(requireContext(), US_Fragment::class.java)
    startActivity(intent)

【讨论】:

好的,我不再收到错误消息,但程序崩溃了。我怀疑这是因为我的 onCreateView 函数没有返回任何内容。我需要写什么来防止它崩溃?谢谢。 这是我写的但是崩溃了。覆盖 fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? return inflater.inflate(R.layout.fragment_us, container, false) 能否分享一下Logcat的确切代码和错误日志? 嗨 Ravi,编辑了这篇文章以更新我编辑的 FragmentNews.kt 和 Logcat 错误消息。非常感谢。

以上是关于Android Kotlin:在 Fragment 下带有 Intent 的 setOnClickListener的主要内容,如果未能解决你的问题,请参考以下文章

在 Fragment 中使用 RecyclerView 时出现 Kotlin 错误的 Android

在 Fragment 当中使用 Kotlin-Android-Extensions 需要注意的

Kotlin Android Fragment recyclerView 和上下文问题

Kotlin Android - 当主活动添加项目时,从 Fragment 刷新 ListView

Android的Kotlin:Fragment+BottomNavigationView实现非滑动页面与底部导航键

Kotlin Android Studio - setContenView - 绑定(片段)