两个片段由另一个片段保存 - findViewById返回null

时间:2012-06-13 14:46:12

标签: android nullpointerexception android-fragments findviewbyid

我的第一个Android应用程序需要帮助。我有一个活动,顶部有一个动作栏和导航标签。由于这些导航标签,我不得不将我的活动转换为碎片。

因此,其中一个活动(现在是片段)拥有两个片段,左边是一个ListFragment,右边是一个DetailFragment,因此用户可以从列表中选择一个项目并直接查看详细信息。右。

但是现在,当Activity被转换为Fragment时,它是包含List-和DetailFragment的Fragment。这工作正常,直到我想要更改DetailsFragment。

首先,这里是片段的代码,其他两个:

public class BlackboardFragment extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        return inflater.inflate(R.layout.fragment_layout, container, false);
    }

}

这是fragment_layout.xml文件(保存在layout-land中):

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

    <fragment
        android:id="@+id/interfaces"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_marginRight="20dp"
        android:layout_weight="0.60"
        class="org.fawkesrobotics.app.InterfaceFragment" />

    <FrameLayout
        android:id="@+id/viewer"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

因此,ListFragment被命名为InterfaceFragment,这里是代码:

public class InterfaceFragment extends ListFragment {

    boolean mDualPane;

//      some other code

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        create_list();

        View viewerFrame = getActivity().findViewById(R.id.viewer);
        mDualPane = viewerFrame != null
                && viewerFrame.getVisibility() == View.VISIBLE;

        if (savedInstanceState != null) {
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }
    }

//      some other code
}

这是它不起作用的地方。 Fragment实际上显示了列表(在create_list()中创建了ListAdapter和其他所有设置),但我的问题是,viewerFrame为null。我在上面的xml文件中声明了id查看器,所以我不明白他为什么找不到id。它是否属于BlackBoardFragment或我的整体活动?因为在BlackboardFragment中我也尝试使用getActivity()。findViewById并且它有效。为什么InterfaceFragment无法找到它?

我也测试过,如果他真的在layout-land中使用了fragment_layout.xml而且他确实如此。所以他应该知道id查看器,但显然不是。

如果您需要更多代码或DetailsFragment中的代码,我可以发布它。

提前感谢您的帮助! :)

2 个答案:

答案 0 :(得分:1)

使用FragmentManager获取Fragment ......

ExampleFragment fragment = (ExampleFragment)  getActivity().getFragmentManager().findFragmentById(R.id.example_fragment);

答案 1 :(得分:1)

Android SDK不支持嵌套Fragment。也就是说,您的Android应用程序中不能有“片段内的片段”。遗憾。

编辑:

嵌套Fragment现在是官方Android 4.2 SDK的一部分!耶!