2013-04-05 40 views
5

EDIT3:似乎只有API17和上面會有ViewPager與ChildFragmentManager正常工作.........ViewPager在DialogFragment,IllegalStateException異常:碎片也有一番景緻

我想到ViewPager添加到我的DialogFragment:

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

,並出於某些原因,它會崩潰說:

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) 
..... 

我一直在google搜索Fragment does not have a view例外了半天沒有結果

在我看來,該適配器不能誇大佈局或東西...

這裏是我的片段和適配器

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

} 

編輯:https://code.google.com/p/android/issues/detail?id=42601看起來相關

EDIT2:我測試的API 16和項目使用支持庫V4修訂版12

回答

1

你測試了哪個Android版本? ViewPagers使用片段,並且由於ViewPager本身位於片段中,因此您正在嵌套片段。嵌套片段僅支持API 17(Jellybean),因此此實現僅適用於Android 4.1+以上的設備。

+9

我在API 16上,但我也使用支持庫v4,不應該支持庫使我的實現兼容較低的API版本嗎? – tom91136 2013-04-06 07:39:43

1

我得到這個錯誤,當我忽略調用後setContentView()旋轉。我想我可能也試圖在onResume()中設置片段 - 這導致了非法狀態(片段試圖添加到不存在的視圖中)。

所以對我來說,以消除

android:configChanges="keyboardHidden|orientation" 

從我的清單,並以檢查onResume一個savedInstanceState/Bundle(所以我可以肯定,讓系統重新創建我的片段,而不是解決辦法添加他們自己

雖然由於這個錯誤是晦澀的,有可能是比我的問題/解決方案在這裏的原因的詳細

編輯:一個鏈接到一些簡單的/有用的代碼:

retain the fragment object while rotating

0

確保,爲u在片段的onCreateView()方法返回rootView。

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

否則,android會在activity的XML中搜索fragment容器。

相關問題