getActivity()。findViewById(R.layout.contacts_list_view)返回null

时间:2013-12-11 15:03:55

标签: android android-listview android-fragments nullpointerexception findviewbyid

我已经看到了一些类似的问题,但这完全是出于不同的原因(我认为)。 我使用的代码取自http://developer.android.com/training。 我正在尝试根据教程构建一个简单的联系人应用程序: http://developer.android.com/training/contacts-provider/retrieve-names.html 我收到错误的部分是为ListView设置CursorAdapter 。 这是我的代码:

@Override
    public void onActivityCreated(Bundle savedInstanceState) 
    {
        super.onActivityCreated(savedInstanceState);
        mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);
        mCursorAdapter = new SimpleCursorAdapter(getActivity(), 
                R.layout.contacts_list_item, null, FROM_COLUMNS, TO_COLUMN, 0);
        mContactsList.setAdapter(mCursorAdapter);
        mContactsList.setOnItemClickListener(this);
        getLoaderManager().initLoader(0, null, this);
    }

所有XML文件都已到位:

contact_list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:clickable="true"/>

contact_list_view.xml:

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

我的主要活动包括2个FrameLayout s用于放入的片段。这是它的XML:

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

    <FrameLayout
        android:id="@+id/frag_contacts"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:textColor="#0a20a3" >
    </FrameLayout>

    <FrameLayout 
        android:id="@+id/frag_contact_details"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="#045011" />

</LinearLayout>

这是活动的onCreate

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ninth);
        if (findViewById(R.id.frag_contacts) != null)
        {
            if (savedInstanceState != null)
                return;
            ContactsFragment contactsFrag = new ContactsFragment();
            getFragmentManager().beginTransaction().add(R.id.frag_contacts, contactsFrag).commit();
        }
    }

另外,这是片段的onCreateView

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.contacts_list_view, container, false);
    }

现在,对于长篇文章感到抱歉,其中一些可能是不必要的,但问题是在第一个片段中,getActivity().findViewById(R.layout.contacts_list_view)始终返回null! 不知道还能做什么。我怎样才能将数据加载到列表中,这里有什么问题? 提前谢谢!

6 个答案:

答案 0 :(得分:2)

更改此

mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);

mContactsList = (ListView) getView().findViewById(R.id.contacts_list_view);

编辑:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+idlist"

 mContactsList = (ListView) getView().findViewById(R.id.list);

答案 1 :(得分:2)

你必须改变

mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);

mContactsList = (ListView) getView().findViewById(R.id.contacts_list_view);

由于ListView属于您在onCreateView内部返回的视图。

答案 2 :(得分:1)

替换

mContactsList = (ListView) getActivity().findViewById(R.layout.contacts_list_view);

mContactsList = (ListView) getView().findViewById(R.id.list);

联系人列表view.xml应更改如下

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

答案 3 :(得分:1)

如果您尝试在onCreateView中执行getActivity()。findViewById(R.id.contacts_list_view),它将返回null,因为尚未创建片段视图。尝试在onResume中执行此操作,它将返回视图:

<?php

$file = "myimage.png";

$image = imagecreatefrompng($file);
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));

imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255));
imagealphablending($bg, TRUE);
imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
imagedestroy($image);

header('Content-Type: image/jpeg');

$quality = 50;
imagejpeg($bg);
imagedestroy($bg);

?>

答案 4 :(得分:0)

您必须等到Fragment附加到Activity。您可以在onAttach(Activity)

中执行Fragment

答案 5 :(得分:0)

片段状态将保存在FragmentActivity中,因此您应该在活动中覆盖onSaveInstanceState。

=ARRAYFORMULA(JOIN(",", IF(A1:A6="bar",ROW(A1:A6),)))