简体   繁体   中英

No view found for id … for fragment in a Dialog

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;
}

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");
        }
    }
);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM