使用Fragment布局..... findViewbyId始终为NULL

时间:2014-01-28 00:21:31

标签: android layout fragment findviewbyid

我是Android开发的新手,我试图让工作成为一个简单的例子。

当布局包含片段时,此片段会膨胀,方法findByViewId会返回NULL指针。我想知道如何避免这种情况。

activity_main.xml 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.todoit.MainActivity"
    tools:ignore="MergeRootFrame" />

到目前为止,我找到的唯一解决方案是不使用片段布局:/

fragment_main.xml 
    <RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.todoit.MainActivity$PlaceholderFragment">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/myEditText"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true" />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/myListView"
        android:layout_below="@+id/myEditText"
        android:layout_alignRight="@+id/myEditText"
        android:footerDividersEnabled="false" /> </RelativeLayout>

此代码返回NULL指针

  

的setContentView(R.layout.activity_main); ListView myListView =   (ListView的)findViewById(R.id.myListView);

我找到的唯一方法就是使用这个。

  

的setContentView(R.layout.fragment_main); ListView myListView =   (ListView的)findViewById(R.id.myListView);

onCreate方法中的所有代码。

有人能告诉我如何解决这个问题吗?有没有办法给整个布局充气,包括片段?

非常感谢。 何

2 个答案:

答案 0 :(得分:1)

您应该仅在片段代码中膨胀片段的视图,而不是在活动代码中。您可以使用onCreateView方法执行此操作。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_main, container, false);
    ListView myListView= (ListView) v.findViewById(R.id.myListView);
    return v;
}

如果您想在ListView被调用后找到onCreateView,可以使用getView()方法:

ListView myListView= (ListView) getView().findViewById(R.id.myListView);

答案 1 :(得分:0)

ListView myListView =(ListView)fragment.getView()。findViewById(R.id.myListView);需要从片段类代码内部调用,而不是主要活动。在onActivityCreated方法中调用它,到那时片段的onCreateView函数就会成功