【问题标题】:Binary XML file line #20: Error inflating class fragment Android二进制 XML 文件第 20 行:膨胀类片段 Android 时出错
【发布时间】:2017-05-10 20:43:34
【问题描述】:

我想在平板电脑视图中显示列表+描述。下面的代码在纵向模式下工作正常,但在横向模式下停止。有什么问题吗?

MainActivity

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

    public class MainActivity extends Activity {

        // 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"};

        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 static class MyDetailFragment extends Fragment {

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                View view = inflater.inflate(R.layout.layout_detailfragment, null);
                return view;
            }

        }

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

            View v = findViewById(R.id.phone_container);
            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.phone_container, myListFragment);
                    fragmentTransaction.commit();
                }
            }
        }
    }

布局/activityMain.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <fragment
            android:id="@+id/titles"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
             />

    </FrameLayout>

res/Layout-land/activitymain.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="Normal" />

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

</LinearLayout>

LayoutdetailFragment.xml

<?xml version="1.0" encoding="utf-8"?>
<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>

错误

E/AndroidRuntime: 致命异常: main 进程:com.example.fyp_awais.tab,PID:3974 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.fyp_awais.tab/com.example.fyp_awais.tab.MainActivity}:android.view.InflateException:二进制 XML 文件第 20 行:膨胀类片段时出错 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在 android.app.ActivityThread.access$800(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 引起:android.view.InflateException:二进制 XML 文件第 20 行:膨胀类片段时出错 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:504) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:365) 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378) 在 android.app.Activity.setContentView(Activity.java:2145) 在 com.example.fyp_awais.tab.MainActivity.onCreate(MainActivity.java:56) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在 android.app.ActivityThread.access$800(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 引起:java.lang.NullPointerException 在 java.lang.VMClassLoader.findLoadedClass(本机方法) 在 java.lang.ClassLoader.findLoadedClass(ClassLoader.java:362) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:499) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:469) 在 android.app.Fragment.instantiate(Fragment.java:604) 在 android.app.Fragment.instantiate(Fragment.java:582) 在 android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2108) 在 android.app.Activity.onCreateView(Activity.java:5328) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:504) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:414) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:365) 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378) 在 android.app.Activity.setContentView(Activity.java:2145) 在 com.example.fyp_awais.tab.MainActivity.onCreate(MainActivity.java:56) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在 android.app.ActivityThread.access$800(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 应用程序终止。

【问题讨论】:

  • 发布您的错误日志。
  • @user6750923,根据你的代码sn-p,我在任何xml文件中都找不到phone_container,你能更新主要活动的xml
  • @TejaDroid 更新
  • @Ahamed 查看有问题的错误

标签: android xml android-fragments


【解决方案1】:

您确定在 横向 模式下遇到错误吗?因为在 landscape 中它运行良好并且在 portrait 模式下您没有使用动态片段,因此您需要扩展 Fragment Activity 而不是 Activity 来运行片段。如果您使用动态片段而不是硬编码会很好。

将您的 layout-port/main_activity 更改为此

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:id="@+id/phone_container2"
    >

  // remove hard coded fragment

</FrameLayout>

// 你的完整解决方案

主要活动

import android.app.Activity;
import android.app.Fragment;
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;

public class MainActivity extends Activity {

    // 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"};

    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 static class MyDetailFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            View view = inflater.inflate(R.layout.layout_detailfragment, null);
            return view;
        }

    }

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

        View v = findViewById(R.id.phone_container);
        if(v == null){
            //it's run on tablet
            isSinglePane = false;

            //if's the first time created
            MyDetailFragment myListFragment = new MyDetailFragment();
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.phone_container2, myListFragment);
            fragmentTransaction.commit();



       /*
        * MyListFragment and MyDetailFragment have been loaded in XML,
        * no need load.
        */

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


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

        }
    }
}

端口:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:id="@+id/phone_container2"
    >

  <!--  <fragment
        android:id="@+id/titles"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />-->

</FrameLayout>

土地:

<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="Normal" />

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

</LinearLayout>

【讨论】:

  • 你能提供一个动态片段的工作示例吗?
  • 我正在使用平板电脑虚拟设备 (Nexus-9)。它可以在纵向模式下找到,但在横向模式下会停止。
  • 对于横向,您正在使用这样的动态。
  • 我不明白你的回答。我没有-port 文件夹。我有 res/layout-land 和 res/layout。
  • 这不是问题 res/layout 如果你把你的肖像代码放在他们那里也可以。
【解决方案2】:

我认为错误出现在 xml 文件的 &lt;fragment&gt;

如果你想在 xml 中使用fragment,那么需要将该片段的类定义为

<fragment
        class="com.example.android.app.fragmentName"
        android:id="@+id/titles"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

else 定义片段内部代码并将 xml 中的 FrameLayout 设置为

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

【讨论】:

猜你喜欢
  • 2016-03-11
  • 1970-01-01
  • 2014-05-04
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多