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

Android Kotlin:片段下带有意图的setOnClickListener

袁炳
2023-03-14

我试图在一个片段下创建一个带有Intent的setOnClickListener,但当我试图用以下方法实例化Intent对象时,我得到了以下错误:

    US.setOnClickListener {

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

错误消息:无法使用提供的参数调用下列函数。(上下文!,类<*>!)在Android.Content.Intent(String!,URI!)中定义在Android.Content.Intent中定义

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)
                }
            }
    }


}
<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_width="match_parent"
    android:layout_height="match_parent"
    tools:context="view.NewsFragment">

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


    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <Button
            android:id="@+id/US"
            android:layout_width="match_parent"
            android:layout_height="269dp"
            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_width="match_parent"
            android:layout_height="269dp"
            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_width="match_parent"
            android:layout_height="269dp"
            android:text="ASIA"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/EMEA" />

    </androidx.constraintlayout.widget.ConstraintLayout>


</FrameLayout>
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个答案

岳风畔
2023-03-14

这应该行得通

US.setOnClickListener {
        var intent = Intent(applicationContext, US_Fragment::class.java)
        startActivity(intent)
}
 类似资料:
  • 现在,我想使用Parse添加服务器拉请求,将列表中的数据添加到适配器,并在用户查看页面后填充recyclerview,这样 1)我是否应该添加setUserVisisbleHint中的所有代码,并只添加0.5秒延迟,以便在调用setContentView后执行它,以确保不出现空指针异常错误或 2)是否有更好的方法/其他功能可以实现相同的功能?

  • 我使用FragmentActivity在片段之间切换。但我希望在片段上有一个管理按钮,当我单击它时,一个新的片段或活动看起来像一个孩子(在操作栏中有后退按钮)。 我怎样才能做到? 这是我的代码,可以使用,但“后退”按钮不会出现在操作栏中: 片段: 活动(目前……但如果需要,可能会出现碎片?): 也许我必须更改舱单中的某些内容?

  • 根据谷歌的文档: 现在可以在片段中嵌入片段。这对于各种情况都很有用,在这些情况下,您需要将动态和可重用的UI组件放置到本身是动态和可重用的UI组件中。例如,如果使用ViewPager创建左右滑动并占用大部分屏幕空间的片段,现在可以将片段插入每个片段页面。要嵌套片段,只需对要添加片段的片段调用getChildFragmentManager()。这将返回一个FragmentManager,您可以像通常

  • 我们使用意图在两个活动之间切换,片段也是出于相同的目的。那么为什么我们不能总是使用意图而不是片段呢?

  • 在我的应用程序中,我有标签的活动(让我们说10个标签)。每个选项卡页都包含和(此ListView中显示的数据是从我的服务器动态加载的)。我使用来显示这些页面。我不想将所有保存在内存中,所以我决定使用(我的适配器类扩展了这些类)。 > 假设选择了第三个选项卡。然后,当我转到第一个选项卡时,应该从头开始为该选项卡创建(这很好,这就是的工作方式),但不恢复该片段以前的状态(例如,不应该滚动到上次访问该时