28

Próbuję pokazać FragmentDialog (utworzone i wyświetlane jako okno dialogowe NIE dodane jako zawartość w hierarchii widoku), gdzie znajduje się ViewPager, którego zawartość jest podawany przez FragmentPagerAdapter (zapewnia Fragmenty składające się z obrazu).ViewPager + FragmentPagerAdapter wewnątrz DialogFragment otrzymuje "IllegalArgumentException: No view found ..."

Kod działa idealnie, kiedy pokazano ViewPager + FragmentPagerAdapter z FragmentActivity, ale pojawia się następujący wyjątek, gdy robi to z FragmentDialog:

„IllegalArgumentException: Nie znaleziono id 0x7f040077 dla fragmentu SimpleFragment widok ...”

Oto mój kod:

A SherlockFragmentActivity za pomocą przycisku do tworzenia i wyświetlania okna dialogowego.

public class BorrameActivity extends SherlockFragmentActivity{ 
    @Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.one_act); 

    Button button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View arg0) { 
      showTheDialog(); 

     }}); 
    } 

    private void showTheDialog(){ 
     AchGalleryDialog newFragment = AchGalleryDialog.newInstance(achs); 
     newFragment.show(getSupportFragmentManager(), "dialog"); 
    } 

FragmentDialog:

public class AchGalleryDialog extends DialogFragment{ 
    public AchGalleryDialog(){ 
} 

    public static AchGalleryDialog newInstance(){  
     AchGalleryDialog f = new AchGalleryDialog(); 
     return f;  
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.dialog_user_result, container); 
     getDialog().setTitle("Hola tronco"); 

     //content to show in the fragments 
     int[] images = new int[]{R.drawable.d1, R.drawable.d2, R.drawable.d3}; 

     ViewPager pager = (ViewPager) view.findViewById(R.id.pager); 
     MyFragmentAdapter adapter = new MyFragmentAdapter(getFragmentManager(),images); 
     pager.setAdapter(adapter); 

     return view; 
    } 
} 

Jest to bardzo prosty MyFragmentPagerAdapter, umieścić jedynie metodę GetItem() i NullPointer kontrole:

@Override 
public Fragment getItem(int position) { 
    return MySimpleFragment.newInstance(images[position]); 

} 

I wreszcie SimpleFragment:

public class SimpleFragment extends Fragment{ 
    int id; 
    public static SimpleAchFragment newInstance(int imgId){ 
     SimpleFragment f = new SimpleFragment(); 
     Bundle args = new Bundle(); 
     args.putLong(ID_BUNDLE, imgId); 
     f.setArguments(args); 

     return f; 
    } 

    public SimpleAchFragment(){ 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     this.id = getArguments() != null ? getArguments().getInt(ID_BUNDLE) : 0;  
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.simple_fragment, container, false); 
     FragmentActivity mAct = getActivity(); 

     ImageView img = (ImageView) v.findViewById(R.id.image); 
     img.setImageDrawable(mAct.getResources().getDrawable(id)); 

     return v; 
    } 

} 

Więcej informacji, jeśli treść przekazana do adaptera (int tablicy z 3 int) ma długość zero, to adapter nie próbuje utworzyć żadnego fragmentu, więc dialogi są wyświetlane poprawnie, ale puste (zgodnie z oczekiwaniami). Wyjątek jest zgłaszany w funkcji SimpleFragment.onCreateView() podczas nadmuchiwania. Identyfikator, do którego odwołuje się wyjątek (nie został znaleziony) odpowiada identyfikatorowi ViewPager, a jest poprawnie zdefiniowany w R.layout.simple_fragment.

Próbowałem również zbudować okno dialogowe z AlertDialog.builder, a także bezpośrednio z kontruktorem Dialog(), ale otrzymałem takie samo zachowanie.

+0

Mam dokładnie ten sam problem ... czy znalazłeś jakieś obejście? – brk3

Odpowiedz

63

Spróbuj tego:

W klasie AchGalleryDialog

MyFragmentAdapter adapter = new MyFragmentAdapter(getChildFragmentManager(),images); 

zamiast

MyFragmentAdapter adapter = new MyFragmentAdapter(getFragmentManager(),images); 

z tego powodu:

http://developer.android.com/about/versions/android-4.2.html#NestedFragments

Mam nadzieję, że to pomoże!

+1

To działa! Stukrotne dzięki. – brk3

+0

Dzięki 70sCommander, jego świetny stałem się z tym problemem zaledwie kilka dni wcześniej niż nowy SDK przybył – juanmeanwhile

+1

Nie, problem ... mając ten sam problem tutaj i zobaczyłem ten post. – 70sCommander

Powiązane problemy