如何在片段中找到视图?

时间:2016-02-14 01:48:55

标签: android android-fragments

我正在尝试添加一个片段,然后在所述片段中找到一个视图,并在其中添加一个视图。但是我继续在这个语句中得到一个NullPointerException

  FrameLayout container2 = (FrameLayout) fragment.getActivity().findViewById(R.id.content_frame);

这是我的代码。有人能告诉我如何解决这个问题吗?感谢

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment fragment = new FragmentNavigationDrawer();
    ViewGroup decor = (ViewGroup) getActivity().getWindow().getDecorView();
    View child = decor.getChildAt(0);
    decor.removeView(child);
    fragmentTransaction.add(decor.getId(), fragment);
    fragmentTransaction.commit();
    FrameLayout container2 = (FrameLayout) fragment.getActivity().findViewById(R.id.content_frame);
    container2.addView(child);

2 个答案:

答案 0 :(得分:1)

只需使用吸气剂。在您的片段上设置一个标记,以便稍后访问它,然后在您的片段上调用getView()以返回其根视图,或使用getter访问特定的View

public class MainActivity extends AppCompatActivity {

    //In onCreate
    if (getFragmentManager().findFragmentByTag(FragmentNavigationDrawer.TAG) == null) {
        getFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, new FragmentNavigationDrawer(), FragmentNavigationDrawer.TAG)
            .commit();
    }

    //Later, when you want to add said View:
    FragmentNavigationDrawer frag = 
        (FragmentNavigationDrawer) getFragmentManager().findFragmentByTag(FragmentNavigationDrawer.TAG)

    //Return the root view:
    View fragRootView = frag.getView();

    //Return a specific view:
    frag.getUpdatableViewGroup().addView(newViewToAdd):

}

对于你的碎片:

public class FragmentNavigationDrawer extends Fragment {

    public static final String TAG = FragmentNavigationDrawer.class.getSimpleName();

    FrameLayout updatableViewGroup;

    //Can do this inside onCreateView() whilst inflating your Fragment's Views
   //That's up to you.
    @Override
    public void onViewCreated (View view, Bundle savedInstanceState) {

        updateableViewGroup = view.findViewById(R.id.updateable_view_group);

    }

    public FrameLayout getUpdatableViewGroup() {
        return updateableViewGroup;
    }

请注意ActivityFragment生命周期,并注意不要试图访问片段的视图,直到它们完成膨胀 - onStart()你的Activity以后应该没问题。

答案 1 :(得分:0)

请参阅FragmentTransaction.commit()的javadoc。它表示将安排对片段后端堆栈进行更改。它不会立即发生。您似乎期望片段及其视图立即可用。

另外,我真的很困惑你为什么要在装饰视图中进行更改。通常,您可以在主机活动的布局中按ID调出视图,并在其中进行更改。