Hoà*_*hải 4 android android-fragments android-dialog
我想在一个自定义Dialog中显示 2 个选项卡Activity,但出现以下错误。
错误:
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}
Run Code Online (Sandbox Code Playgroud)
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); }); }
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
您收到该异常是因为Activity's在 a 中FragmentManager找不到Views Dialog,因为它的布局未附加到Activity's 的层次结构。为了Fragment在 a 中使用s Dialog,您必须使用 a 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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到您在onClick()方法中拥有的所有内容现在都在 中处理DialogFragment,并且该方法变得简单:
pick_color.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ThemeDialogFragment().show(getSupportFragmentManager(), "theme");
}
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1383 次 |
| 最近记录: |