2013-04-05 39 views
5

EDIT3: có vẻ như chỉ API17 trở lên sẽ có ViewPager hoạt động bình thường với ChildFragmentManager .........ViewPager trong DialogFragment, IllegalStateException: Fragment không có một cái nhìn

Tôi đang cố gắng để thêm một ViewPager để DialogFragment tôi:

public class FirstLaunchDialogFragment extends DialogFragment { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_Sherlock_Light_Dialog); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final View v = getActivity().getLayoutInflater().inflate(
      R.layout.fragment_dialog_first_launch, null); 
    ViewPager viewPager = (ViewPager) v.findViewById(R.id.pager); 

    viewPager.setAdapter(new FirstLaunchFragmentsAdapter(getChildFragmentManager())); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setView(v).setInverseBackgroundForced(true); 
    return builder.create(); 
} 
} 

và đối với một số lý do, nó sẽ sụp đổ nói:

04-06 00:00:49.600: E/AndroidRuntime(3734): java.lang.IllegalStateException: Fragment does not have a view 
04-06 00:00:49.600: E/AndroidRuntime(3734):  at android.support.v4.app.Fragment$1.findViewById(Fragment.java:1425) 
04-06 00:00:49.600: E/AndroidRuntime(3734):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901) 
04-06 00:00:49.600: E/AndroidRuntime(3734):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
04-06 00:00:49.600: E/AndroidRuntime(3734):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
04-06 00:00:49.600: E/AndroidRuntime(3734):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
04-06 00:00:49.600: E/AndroidRuntime(3734):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461) 
..... 

Tôi đã googling cho Fragment does not have a view ngoại lệ cho một nửa ngày nay không có kết quả

Dường như với tôi rằng Adaptor không thể thổi phồng bố trí hoặc một cái gì đó ...

Dưới đây là Fragment và Adaptor tôi

public static class UserWelcomeFragment extends Fragment { 

    public static UserWelcomeFragment newInstance() { 
     return new UserWelcomeFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_welcome_user, container, false); 

     return v; 
    } 

} 

private class FirstLaunchFragmentsAdapter extends FragmentPagerAdapter { 

    public FirstLaunchFragmentsAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     switch (arg0) { 
     case 0: 
      return UserWelcomeFragment.newInstance(); 

     case 1: 
      return new IntegrationSelectingDialogFragment(); 

     default: 
      return UserWelcomeFragment.newInstance(); 
     } 

    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

} 

EDIT: https://code.google.com/p/android/issues/detail?id=42601 trông có liên quan

EDIT2: tôi đang thử nghiệm trên API 16 và dự án được sử dụng thư viện hỗ trợ v4 sửa đổi 12

Trả lời

1

Phiên bản Android nào bạn đang thử nghiệm tính năng này? ViewPagers sử dụng phân đoạn và vì ViewPager của bạn nằm trong một phân đoạn, bạn đang lồng các mảnh. Các đoạn lồng nhau chỉ được hỗ trợ từ API 17 (Jellybean), vì vậy việc triển khai này sẽ chỉ hoạt động trên các thiết bị chạy Android 4.1 trở lên.

+9

Tôi đang sử dụng API 16 nhưng tôi cũng đang sử dụng Thư viện hỗ trợ v4, thư viện hỗ trợ có nên thực hiện triển khai của tôi tương thích với các phiên bản API thấp hơn không? – tom91136

1

Tôi gặp lỗi này khi tôi bỏ qua gọi setContentView() sau khi xoay. Tôi nghĩ rằng tôi có thể cũng đã cố gắng để thiết lập các mảnh trong onResume() - gây ra tình trạng bất hợp pháp (một mảnh cố gắng để được thêm vào một cái nhìn không tồn tại).

Vì vậy, đối với tôi, giải pháp là để loại bỏ

android:configChanges="keyboardHidden|orientation" 

Từ biểu hiện của tôi, và để kiểm tra một savedInstanceState/Bundle trong onResume (vì vậy tôi có thể chắc chắn để cho hệ thống tái tạo mảnh vỡ của tôi, chứ không phải là bổ sung chúng mình

Mặc dù do lỗi này là hơi khó hiểu, có thể có nguyên nhân hơn vấn đề của tôi/giải pháp ở đây

Edit:. một liên kết đến một số mã đơn giản/hữu ích:

retain the fragment object while rotating

0

Đảm bảo rằng u trả về rootView trong phương thức onCreateView() của đoạn.

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

    rootView = inflater.inflate(R.layout.fragment_layout, container, false); 

    getChildFragmentManager().beginTransaction().add(R.id.fragment_container, MyFragment.getInstance()).commit(); 

    return rootView; 
} 

Nếu không, android sẽ tìm kiếm vùng chứa phân đoạn trong XML của hoạt động.

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