繁体   English   中英

如何用片段替换Activity中的FrameLayout?

[英]How to replace FrameLayout in Activity with a fragment?

我是Android的新手,只是尝试通过参考在线教程来实现这些片段。 我在Fragment.kt的第一行出现错误。 我完全按照所示完成了所有步骤,甚至尝试在Google上搜索错误,但似乎对我没有任何帮助。我得到的错误如下。

12-23 19:15:53.369 11656-11656/com.example.mandar.testapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                             Process: com.example.mandar.testapp, PID: 11656
                                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mandar.testapp/com.example.mandar.testapp.MainActivity}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2687)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753)
                                                                                 at android.app.ActivityThread.access$1100(ActivityThread.java:186)
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                                 at android.os.Looper.loop(Looper.java:238)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:6016)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:937)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:798)
                                                                              Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
                                                                                 at com.example.mandar.testapp.BlankFragment.onCreateView(BlankFragment.kt:0)
                                                                                 at android.app.Fragment.performCreateView(Fragment.java:2236)
                                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:986)
                                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1161)
                                                                                 at android.app.BackStackRecord.run(BackStackRecord.java:800)
                                                                                 at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1575)
                                                                                 at android.app.FragmentController.execPendingActions(FragmentController.java:325)
                                                                                 at android.app.Activity.performStart(Activity.java:6481)
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2650)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753) 
                                                                                 at android.app.ActivityThread.access$1100(ActivityThread.java:186) 
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609) 
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                                 at android.os.Looper.loop(Looper.java:238) 
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:6016) 
                                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:937) 
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:798) 

MainActivity.kt

package com.example.mandar.testapp

import android.app.Activity
import android.app.Fragment
import android.os.Bundle

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var manager = fragmentManager
        var fragment : Fragment? = manager.findFragmentById(R.id.lll)
        if(fragment == null){
            fragment = BlankFragment()
            manager.beginTransaction().replace(R.id.lll,fragment).commit()
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="com.example.mandar.testapp.MainActivity">

    <FrameLayout
        android:id="@+id/lll"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

</LinearLayout>

空白片段

package com.example.mandar.testapp


import android.os.Bundle
import android.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup


/**
 * A simple [Fragment] subclass.
 * Use the [BlankFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class BlankFragment : Fragment() {

    // TODO: Rename and change types of parameters
    private var mParam1: String? = null
    private var mParam2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (arguments != null) {
            mParam1 = arguments.getString(ARG_PARAM1)
            mParam2 = arguments.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false)
    }

    companion object {
        // TODO: Rename parameter arguments, choose names that match
        // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
        private val ARG_PARAM1 = "param1"
        private val ARG_PARAM2 = "param2"

        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment BlankFragment.
         */
        // TODO: Rename and change types and number of parameters
        fun newInstance(param1: String, param2: String): BlankFragment {
            val fragment = BlankFragment()
            val args = Bundle()
            args.putString(ARG_PARAM1, param1)
            args.putString(ARG_PARAM2, param2)
            fragment.arguments = args
            return fragment
        }
    }

}// Required empty public constructor

和fragment_blank.xml

<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="com.example.mandar.testapp.BlankFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

有什么建议为什么这个简单的代码不起作用? 在这里,我用fragment代替FrameLayout lll。

错误消息: 指定为非null的参数为null :方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数saveInstanceState 然后saveInstanceState可以为null,因此您必须添加? 将片段捆绑在一起之后。

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_blank, container, false)
}

请使用AppCompatActivity而不是Activity和进口import android.support.v4.app.Fragment代替import android.app.FragmentBlankFragment片段和替代fragmentManagersupportFragmentManager它完美的作品。

这是您修改的代码

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    var manager = supportFragmentManager
    var fragment : Fragment? = manager.findFragmentById(R.id.lll)
    if(fragment == null){
        fragment = BlankFragment()
        manager.beginTransaction().replace(R.id.lll,fragment).commit()
    }
  }
}

和片段

import android.os.Bundle
import android.support.annotation.Nullable
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class BlankFragment : Fragment() {

// TODO: Rename and change types of parameters
private var mParam1: String? = null
private var mParam2: String? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (arguments != null) {
        mParam1 = arguments.getString(ARG_PARAM1)
        mParam2 = arguments.getString(ARG_PARAM2)
    }
}

override fun onCreateView(inflater: LayoutInflater?, @Nullable container: ViewGroup?, @Nullable savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    return inflater?.inflate(R.layout.fragment_blank, container, false)
}

companion object {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private val ARG_PARAM1 = "param1"
    private val ARG_PARAM2 = "param2"

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment BlankFragment.
     */
    // TODO: Rename and change types and number of parameters
    fun newInstance(param1: String, param2: String): BlankFragment {
        val fragment = BlankFragment()
        val args = Bundle()
        args.putString(ARG_PARAM1, param1)
        args.putString(ARG_PARAM2, param2)
        fragment.arguments = args
        return fragment
    }
 }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM