在对话框中找不到id ... for fragment的视图

时间:2017-08-20 07:38:12

标签: android android-fragments android-dialog

我想在Dialog中的自定义Activity中显示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;
}

1 个答案:

答案 0 :(得分:3)

由于Activity FragmentManagerView找不到Dialog,因为其布局未附加,因此您收到该例外情况到Activity的层次结构。要在Fragment中使用Dialog,您必须使用DialogFragment,将其子FragmentManager传递给PagerAdapter来处理交易。

与常规Fragment一样,我们可以在onCreateView()中对广告进行充气,并在onViewCreated()中进行设置。我们还会覆盖onCreateDialog()方法来修改那里的窗口设置。

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