二进制XML文件行#26:在Android中输入类片段时出错

时间:2016-12-27 18:33:58

标签: android xml android-fragments

运行代码后,我收到错误Error inflating class

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.umairgulfad.bismillah, PID: 14270
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.umairgulfad.bismillah/com.example.umairgulfad.bismillah.MainActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class fragment
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2697)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2771)
                      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4380)
                      at android.app.ActivityThread.access$1000(ActivityThread.java:177)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1438)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5912)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
                   Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class fragment
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:366)
                      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:436)
                      at android.app.Activity.setContentView(Activity.java:2245)
                      at com.example.umairgulfad.bismillah.MainActivity.onCreate(MainActivity.java:73)
                      at android.app.Activity.performCreate(Activity.java:6185)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2650)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2771) 
                      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4380) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:177) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1438) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5912) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 
                   Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.example.umairgulfad.bismillah.MainActivity$MyDetailFragment that is not a Fragment
                      at android.app.Fragment.instantiate(Fragment.java:618)
                      at android.app.Fragment.instantiate(Fragment.java:594)
                      at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2124)
                      at android.app.Activity.onCreateView(Activity.java:5523)
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:740)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:813) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:821) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:511) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
                      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:436) 
                      at android.app.Activity.setContentView(Activity.java:2245) 
                      at com.example.umairgulfad.bismillah.MainActivity.onCreate(MainActivity.java:73) 
                      at android.app.Activity.performCreate(Activity.java:6185) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2650) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2771) 
                      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4380) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:177) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1438) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5912) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 
                   Caused by: java.lang.ClassCastException
                      at android.app.Fragment.instantiate(Fragment.java:618) 
                      at android.app.Fragment.instantiate(Fragment.java:594) 
                      at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2124) 
                      at android.app.Activity.onCreateView(Activity.java:5523) 
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:740) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:813) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:821) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:511) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
                      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:436) 
                      at android.app.Activity.setContentView(Activity.java:2245) 
                      at com.example.umairgulfad.bismillah.MainActivity.onCreate(MainActivity.java:73) 
                      at android.app.Activity.performCreate(Activity.java:6185) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2650) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2771) 
                      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4380) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:177) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1438) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5912) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

代码在纵向模式下运行良好,但在进入横向模式时,应用程序停止工作。这里有什么问题。提前致谢。

布局-脊/ activity_main.xml中

    <LinearLayout 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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context=".MainActivity" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="sw600dp" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <fragment
                android:name="com.example.umairgulfad.bismillah.MainActivity$MyListFragment"
                android:id="@+id/list_fragment"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="1" />
            <fragment
                android:name="com.example.umairgulfad.bismillah.MainActivity$MyDetailFragment"
                android:id="@+id/detail_fragment"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="2" />

        </LinearLayout>

    </LinearLayout>

布局/ activity_main.xml中

    <LinearLayout 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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context=".MainActivity" >

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:layout_weight="2"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:id="@+id/mapwhere" />

    </LinearLayout>

布局-脊/ detailfragment.xml

    <LinearLayout 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"
        android:orientation="vertical">



        <TextView
            android:id="@+id/title_detailfragment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Detail Fragment"/>

    </LinearLayout>

MainActivity

    import android.app.Activity;
    import android.app.FragmentTransaction;
    import android.app.ListFragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ListAdapter;

    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.OnMapReadyCallback;
    import com.google.android.gms.maps.SupportMapFragment;


    public class MainActivity extends Activity implements OnMapReadyCallback {

        // if run on phone, isSinglePane = true
        // if run on tablet, isSinglePane = false
        boolean isSinglePane;

        static String[] month ={
                "January", "February", "March", "April",
                "May", "June", "July", "August",
                "September", "October", "November", "December"};

        @Override
        public void onMapReady(GoogleMap googleMap) {

        }

        public static class MyListFragment extends ListFragment {

            @Override
            public void onActivityCreated(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onActivityCreated(savedInstanceState);

                ListAdapter myArrayAdapter =
                        new ArrayAdapter<String>(
                                getActivity(), android.R.layout.simple_list_item_1, month);
                setListAdapter(myArrayAdapter);

            }

        }

        public class MyDetailFragment extends SupportMapFragment {
            @Override
            public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
                View rootView = layoutInflater.inflate(R.layout.detailfragment, viewGroup, false);
                SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapwhere);
                mapFragment.getMapAsync(new OnMapReadyCallback() {
                    @Override
                    public void onMapReady(GoogleMap googleMap) {

                    }
                });



                return rootView;
            }
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            View v = findViewById(R.id.mapwhere);
            if(v == null){
                //it's run on tablet
                isSinglePane = false;
       /*
        * MyListFragment and MyDetailFragment have been loaded in XML,
        * no need load.
        */

            }else{
                //it's run on phone
                //Load MyListFragment programmatically
                isSinglePane = true;

                if(savedInstanceState == null){
                    //if's the first time created
                    MyListFragment myListFragment = new MyListFragment();
                    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.add(R.id.mapwhere, myListFragment);
                    fragmentTransaction.commit();
                }
            }
        }

    }

我使用ListFragment扩展了android.support.v4.app.ListFragment类,但现在错误出现在fragmentTransaction.add(R.id.mapwhere, myListFragment);行错误

  

无法解析方法:add(int,com.example.umairgulfad.bismillad.MainActivity.MyLis tFragments)

1 个答案:

答案 0 :(得分:1)

Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.example.umairgulfad.bismillah.MainActivity$MyDetailFragment that is not a Fragment

有两种类型的片段:原生片段和支持/后端片段。你需要选择一种类型并坚持下去。

目前,您正试图同时使用两者:

  • 您正在使用getFragmentManager()添加MyListFragment,表示MyListFragment延伸android.app.ListFragment,而不是android.support.v4.app.ListFragment

  • 您正在使用SupportMapFragment,这是一个支持/后端片段