我正在尝试添加一个片段,然后在所述片段中找到一个视图,并在其中添加一个视图。但是我继续在这个语句中得到一个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);
答案 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;
}
请注意Activity
和Fragment
生命周期,并注意不要试图访问片段的视图,直到它们完成膨胀 - onStart()
你的Activity
以后应该没问题。
答案 1 :(得分:0)
请参阅FragmentTransaction.commit()的javadoc。它表示将安排对片段后端堆栈进行更改。它不会立即发生。您似乎期望片段及其视图立即可用。
另外,我真的很困惑你为什么要在装饰视图中进行更改。通常,您可以在主机活动的布局中按ID调出视图,并在其中进行更改。