问题
I want show 2 tabs in a custom Dialog
in an Activity
, but I am getting the following error.
Error:
No view found for id 0x7f0f0134 (com.hiro.chatio:id/viewPage_theme) for fragment
PostColorPickerFragment{35ffefce #0 id=0x7f0f0134 android:switcher:2131689780:0}
java.lang.IllegalArgumentException: No view found for id 0x7f0f0134 (com.hiro.chatio:id/viewPage_theme)
for fragment PostColorPickerFragment{35ffefce #0 id=0x7f0f0134 android:switcher:2131689780:0}
MainActivity
:
private Button pick_color;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_blog);
pick_color = (Button) findViewById(R.id.create_blog_color_btn);
pick_color.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(CreateBlogActivity.this);
dialog.setContentView(R.layout.blog_theme_picker);
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().getAttributes().windowAnimations = R.style.SlideUpDialogAnimation;
Button pickColor = (Button) dialog.findViewById(R.id.pick_color_btn);
Button default_color = (Button) dialog.findViewById(R.id.default_color);
TabLayout mTabLayout = (TabLayout) dialog.findViewById(R.id.main_tabs_theme);
CustomViewPager mViewPager = (CustomViewPager) dialog.findViewById(R.id.viewPage_theme);
ThemePagerAdapter mThemePagerAdapter = new ThemePagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mThemePagerAdapter);
mViewPager.setCurrentItem(0);
mViewPager.setPagingEnabled(false);
mTabLayout.setupWithViewPager(mViewPager); }); }
ThemePagerAdapter
:
public class ThemePagerAdapter extends FragmentPagerAdapter {
public ThemePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
PostColorPickerFragment postColorPickerFragment = new PostColorPickerFragment();
return postColorPickerFragment;
case 1:
PostThemePickerFragment postThemePickerFragment = new PostThemePickerFragment();
return postThemePickerFragment;
default:
return null;
}
}
@Override
public int getCount() {
return 2;
}
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Color";
case 1:
return "Theme";
default:
return null;
}
}
PostThemePickerFragment
:
public class PostThemePickerFragment extends Fragment {
public PostThemePickerFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.post_theme_picker, container, false);
return view;
}
回答1:
You're getting that Exception because the Activity
's FragmentManager
cannot find View
s in a Dialog
, as its layout is not attached to the Activity
's hierarchy. In order to use Fragment
s in a Dialog
, you'll have to use a DialogFragment
, passing its child FragmentManager
to the PagerAdapter
to handle the transactions.
As with any regular Fragment
, we can inflate the layout in onCreateView()
, and set it up in onViewCreated()
. We'll also override the onCreateDialog()
method to modify the window settings there.
public class ThemeDialogFragment extends DialogFragment {
public ThemeDialogFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.blog_theme_picker, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
Button pickColor = (Button) view.findViewById(R.id.pick_color_btn);
Button default_color = (Button) view.findViewById(R.id.default_color);
TabLayout mTabLayout = (TabLayout) view.findViewById(R.id.main_tabs_theme);
CustomViewPager mViewPager = (CustomViewPager) view.findViewById(R.id.viewPage_theme);
ThemePagerAdapter mThemePagerAdapter = new ThemePagerAdapter(getChildFragmentManager());
mViewPager.setAdapter(mThemePagerAdapter);
mViewPager.setCurrentItem(0);
mViewPager.setPagingEnabled(false);
mTabLayout.setupWithViewPager(mViewPager);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog d = super.onCreateDialog(savedInstanceState);
d.getWindow().getAttributes().windowAnimations = R.style.SlideUpDialogAnimation;
d.requestWindowFeature(Window.FEATURE_NO_TITLE);
d.setCanceledOnTouchOutside(false);
return d;
}
}
You can see that everything you had in the onClick()
method is now handled in the DialogFragment
, and that method becomes simply:
pick_color.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ThemeDialogFragment().show(getSupportFragmentManager(), "theme");
}
}
);
来源:https://stackoverflow.com/questions/45779665/no-view-found-for-id-for-fragment-in-a-dialog