2017-12-23 5 views
0

Ich bin ein Neuling für Android und habe gerade versucht, die Fragmente durch Verweis auf das Online-Tutorial zu implementieren. Ich erhalte einen Fehler in der ersten Zeile von Fragment.kt. Ich folgte allen Schritten perfekt wie gezeigt und versuchte sogar, auf Google nach Fehler zu suchen, aber nichts scheint für mich zu arbeiten. Der Fehler, den ich bekomme, ist wie folgt.Wie FrameLayout in Aktivität mit einem Fragment ersetzen?

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> 

BlankFragment.kt

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 

und fragment_blank.xml

012.351.
<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> 

Irgendwelche Vorschläge, warum dieser einfache Code nicht funktioniert? Hier ersetze ich FrameLayout lll durch Fragment.

Antwort

1

Der Fehler sagt: Parameter als nicht-null spezifiziert ist null: Methode kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, Parameter savedInstanceState. Dann kann savedInstanceState null sein und Sie müssen also hinzufügen? nach Bundle in deinem Fragment.

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

'savedInstanceState: Bundle' sind Nullable auch in Java. – Enzokie

+0

Es hat funktioniert. Vielen Dank. Ich verstehe einfach nicht, warum automatisch generierter Code Typ Bundle anstelle von Bundle gibt. Es ist manchmal verwirrend. –

0

Bitte benutzen Sie AppCompatActivity statt Activity und importieren import android.support.v4.app.Fragment statt import android.app.Fragment für BlankFragment Fragment und ersetzen fragmentManager mit supportFragmentManager es perfekt funktioniert.

Hier ist Ihre modifizierte Code

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

und Fragment

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

} 
Verwandte Themen