2017-08-20 3 views
1

Ich möchte 2 Registerkarten in einem benutzerdefinierten Dialog in einem Activity zeigen, aber ich erhalte den folgenden Fehler.Keine Ansicht für ID gefunden ... für Fragment in einem Dialog

Fehler:

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

wo ist 'PostColorPickerFragment' Code? –

+0

Anstatt nur einen 'Dialog' zu verwenden, müssen Sie' 'DialogFragment' 'und seinen Child' FragmentManager' verwenden, damit dieser 'ViewPager' funktioniert. Der 'FragmentManager' der' Activity' ist nicht in der Lage, etwas in einem 'Dialog' zu finden, da es nicht an die' Activity'-Hierarchie angehängt ist. –

+0

Mike M. hat Recht. Sie müssen 'DialogFragment' anstelle von' Dialog' verwenden. – Wizard

Antwort

1

Sie bekommen diese Ausnahme, weil die Activity ‚s FragmentManager nicht View s in einem Dialog, wie das Layout ist nicht auf die Activity angebracht finden‘ s-Hierarchie. Um Fragment s in einem Dialog zu verwenden, müssen Sie ein DialogFragment verwenden und sein Kind FragmentManager an die PagerAdapter übergeben, um die Transaktionen zu behandeln.

Wie bei jedem normalen Fragment können wir das Layout in onCreateView() aufblasen und in onViewCreated() einrichten. Wir überschreiben auch die onCreateDialog() Methode, um die Fenstereinstellungen dort zu ändern.

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

Sie sehen, dass alles können Sie in der onClick() Methode hatte nun in der DialogFragment behandelt wird, und das Verfahren wird einfach:

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

tks u, hat gut funktioniert !!! –

Verwandte Themen