没有找到 id 的视图 ... 对话框中的片段

No view found for id ... for fragment in a Dialog

我想在 Activity 中的自定义 Dialog 中显示 2 个选项卡,但出现以下错误。

错误:

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

你得到那个异常是因为 ActivityFragmentManagerDialog 中找不到 View,因为它的布局没有附加到 Activity的层次结构。为了在 Dialog 中使用 Fragment,您必须使用 DialogFragment,将其子 FragmentManager 传递给 PagerAdapter 来处理事务.

与任何常规 Fragment 一样,我们可以在 onCreateView() 中扩充布局,并在 onViewCreated() 中进行设置。我们还将覆盖 onCreateDialog() 方法以修改那里的 window 设置。

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

您可以看到 onClick() 方法中的所有内容现在都在 DialogFragment 中处理,并且该方法变得简单:

pick_color.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new ThemeDialogFragment().show(getSupportFragmentManager(), "theme");
        }
    }
);