NullPointerException: 名称 == null

Posted

技术标签:

【中文标题】NullPointerException: 名称 == null【英文标题】:NullPointerException: name == null 【发布时间】:2013-08-07 14:18:52 【问题描述】:

我正在开发一个使用 Fragments 的 android 应用程序。我收到了这个错误。

Caused by: java.lang.NullPointerException: name == null

name == null 是什么意思?这是完整的日志

08-04 15:02:22.422: E/AndroidRuntime(2499): FATAL EXCEPTION: main
08-04 15:02:22.422: E/AndroidRuntime(2499): java.lang.RuntimeException: Unable to start activity ComponentInfofi.peltoset.mikko.home/fi.peltoset.mikko.home.Koti: android.view.InflateException: Binary XML file line #17: Error inflating class fragment
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.os.Looper.loop(Looper.java:137)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.ActivityThread.main(ActivityThread.java:4745)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at java.lang.reflect.Method.invokeNative(Native Method)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at java.lang.reflect.Method.invoke(Method.java:511)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at dalvik.system.NativeStart.main(Native Method)
08-04 15:02:22.422: E/AndroidRuntime(2499): Caused by: android.view.InflateException: Binary XML file line #17: Error inflating class fragment
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.Activity.setContentView(Activity.java:1867)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at fi.peltoset.mikko.home.Koti.onCreate(Koti.java:13)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.Activity.performCreate(Activity.java:5008)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-04 15:02:22.422: E/AndroidRuntime(2499):     ... 11 more
08-04 15:02:22.422: E/AndroidRuntime(2499): Caused by: java.lang.NullPointerException: name == null
08-04 15:02:22.422: E/AndroidRuntime(2499):     at java.lang.VMClassLoader.findLoadedClass(Native Method)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:354)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at java.lang.ClassLoader.loadClass(ClassLoader.java:491)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.Fragment.instantiate(Fragment.java:574)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.Fragment.instantiate(Fragment.java:552)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.app.Activity.onCreateView(Activity.java:4656)
08-04 15:02:22.422: E/AndroidRuntime(2499):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
08-04 15:02:22.422: E/AndroidRuntime(2499):     ... 21 more

这是在一个名为Navigation 的类中。它扩展了android.app.Fragment

在它的onCreateView 方法中,我膨胀布局并返回它。在onActivityCreated 方法中,我检查布局是否有两个窗格(我对不同的设备有不同的布局),并在此基础上将 onClickListeners 添加到这些窗格中。

我的代码如下所示。

public class Navigation extends Fragment 
    private OnItemSelectedListener listener;
    private boolean dualPane = false;

    public interface OnItemSelectedListener 
        public void onMenuItemSelected(int fragmentId);
    

    public void onAttach(Activity activity) 
        super.onAttach(activity);

        if(activity instanceof OnItemSelectedListener) 
            this.listener = (OnItemSelectedListener) activity;
         else 
            ...
        
    

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        View view = inflater.inflate(R.layout.activity_navigation, container, false);

        return view;
    

    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);

        View contentPane = getActivity().findViewById(R.id.contentFragment);
        dualPane = contentPane != null && contentPane.getVisibility() == View.VISIBLE;

        if(dualPane) 
            final ListView menu = (ListView) getActivity().findViewById(R.id.valikko);

            menu.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

            String[] texts = new String[] 
                    ...
            ;

            ArrayList<MenuItem> items = new ArrayList<MenuItem>();
            items.add(new MenuItem("Home", R.drawable.koti2));
            ...

            ImageArrayAdapter adapter = new ImageArrayAdapter(getActivity(), items, texts);
            menu.setAdapter(adapter);

            menu.setOnItemClickListener(new OnItemClickListener() 
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
                    String item = ((TextView) view.findViewById(R.id.label)).getText().toString();

                    listener.onMenuItemSelected(0); // TODO ...
                           
            );
         else 
            ImageView btnYleiskatsaus   = (ImageView) getActivity().findViewById(R.id.btnYleiskatsaus);
            ...

            btnYleiskatsaus.setOnClickListener(onMenuClikkedListener);
            ...
               
    

    private OnClickListener onMenuClikkedListener = new OnClickListener() 

        @Override
        public void onClick(View v)            
            ...         
        
    ;

布局文件layout-sw720dp-land/activity_navigation.xml 是这样的

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@color/pressed_koti"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/valikko"
        android:layout_
        android:layout_
        android:layout_weight="1" >
    </ListView>
</LinearLayout>

这是activity_koti.xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <fragment 
        android:id="@+id/menuFragment"
        android:layout_
        android:layout_
        class="fi.peltoset.mikko.home.Navigation" />

    <fragment 
        android:id="@+id/contentFragment"
        android:layout_
        android:layout_ />
</LinearLayout>

我在装有 Android 4.1.2 的模拟器上运行该应用程序。

是什么导致了这些错误,我该如何解决?

【问题讨论】:

我知道那些是什么,但我想知道它是从哪里来的。在代码中找不到... fi.peltoset.mikko.home.Koti.onCreate(Koti.java:13) 的内容似乎是您的代码在堆栈跟踪中导致此问题的原因 @Robadob 这是应用程序启动器 Activity 的 onCreate 方法,在那一行有setContentView(R.layout.activity_koti); 然后显示那个 xml 文件,而不是另一个。 您应该检查存储在 R.layout 的 XML 文件中是否正确设置了 activity_koti。如果是,请检查 acitivity_koti.xml 是否有错误。 【参考方案1】:

您应该使用android:name 来指向您的片段而不是class,还需要为您的第二个片段包含相同的属性,这将解释name==null

编辑: Apparently class may be interchangeable with android:name,但我会遵循文档使用的内容。

应该是的;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <fragment 
        android:id="@+id/menuFragment"
        android:layout_
        android:layout_
        android:name="fi.peltoset.mikko.home.Navigation" />

    <fragment 
        android:id="@+id/contentFragment"
        android:layout_
        android:layout_
        android:name="I NEED A NAME" />
</LinearLayout>

http://developer.android.com/training/basics/fragments/creating.html#AddInLayout

【讨论】:

感谢您指出我也需要第二个片段元素上的android:name(或类)属性。该元素包含可交换的内容,所以我没有它。感谢this post,我将第二个片段替换为 LinearLayout 并以编程方式插入布局。【参考方案2】:

当你在 XML 文件中添加一个片段时,你需要给它一个name 属性。这就是为什么它说“name = null”,因为你没有这样做。

请参阅the guide for adding Fragments 了解更多信息。

【讨论】:

【参考方案3】:

如果您在FragmentActivity 中引用它,请尝试将class 添加到activity_koti.xml 中的第二个片段。

或者,正如 Robadob 所说,将android:name:"your.path.YourName" 添加到两者中。

Fragments here 的 XML 引用中有关 classandroid:name 的有趣附加信息。

【讨论】:

两个(1,2)android 指南页面上的片段没有提到class 属性,他们使用android:name 来表示功能。在检查docs 页面时,使用class 而不是android:name @Robadob 是的,它确实有效,我保证 :) 我在 xml 中使用 class 开发了一些片段。不太确定它是否适用,因为它们是支持片段,但它似乎不相关。请参阅我的编辑以获取classandroid:name 上的 SO 问题的链接。 我的答案中已经包含了相同的链接,请阅读。 @Robadob 哎呀 - 我读了你的评论并在再次阅读你的答案之前做出了反应。

以上是关于NullPointerException: 名称 == null的主要内容,如果未能解决你的问题,请参考以下文章

接触游标返回 NullPointerException

字符串中的 Android Kotlin NullPointerException

JoinTable 注释导致 NullPointerException

通过 Parcelable 发送嵌套 ArrayList 时出现 NullPointerException

浮动操作按钮 onClick 上的 viewPagerAdapter 片段 NullPointerException

为什么我的适配器不工作?如何解决NullPointerException错误?