28

Tôi đang cố gắng hiển thị FragmentDialog (được tạo và hiển thị dưới dạng hộp thoại KHÔNG được thêm làm nội dung trong phân cấp khung nhìn) trong đó có ViewPager có nội dung được đưa ra bởi một FragmentPagerAdapter (cung cấp các mảnh bao gồm một hình ảnh).ViewPager + FragmentPagerAdapter bên trong một DialogFragment được "IllegalArgumentException: No view found ..."

Mã này hoạt động hoàn hảo khi hiển thị ViewPager + FragmentPagerAdapter từ một FragmentActivity, nhưng có được ngoại lệ sau khi thực hiện nó từ một FragmentDialog:

"IllegalArgumentException: Không xem tìm thấy cho id 0x7f040077 cho mảnh SimpleFragment ..."

Đây là mã của tôi:

Một SherlockFragmentHoạt động với nút để tạo và hiển thị hộp thoại.

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

Các 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; 
    } 
} 

Đây là MyFragmentPagerAdapter rất đơn giản, tôi đặt chỉ GetItem() phương pháp, và nullPointer kiểm tra:

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

} 

Và cuối cùng 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; 
    } 

} 

Thông tin khác, nếu nội dung được truyền tới bộ điều hợp (mảng int có 3 int) có độ dài bằng không, thì bộ điều hợp không cố tạo bất kỳ Fragment nào để hộp thoại xuất hiện chính xác nhưng trống (như mong đợi). Ngoại lệ được ném tại SimpleFragment.onCreateView() tại thời điểm tăng. ID được tham chiếu trong trường hợp ngoại lệ (không tìm thấy) tương ứng với id của ViewPager, được định nghĩa đúng trong R.layout.simple_fragment.

Tôi cũng cố gắng để xây dựng hộp thoại với một AlertDialog.builder và cũng trực tiếp với Dialog() contructor, nhưng có được hành vi tương tự.

+0

Tôi gặp vấn đề tương tự ... bạn có tìm thấy cách giải quyết nào không? – brk3

Trả lời

63

Hãy thử điều này:

Trong lớp AchGalleryDialog

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

thay vì

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

Bởi vì điều này:

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

Hy vọng điều này sẽ hữu ích!

+1

Công trình này !! Cảm ơn rất nhiều. – brk3

+0

Cảm ơn 70sCommander, tuyệt vời của tôi tôi đã trở thành với vấn đề này chỉ là một vài ngày trước khi SDK mới đến – juanmeanwhile

+1

Không, vấn đề ... có cùng một vấn đề ở đây và thấy bài đăng này. – 70sCommander

Các vấn đề liên quan