28

我想顯示一個FragmentDialog(創建並顯示爲一個對話框不添加爲視圖層次結構中的內容),其中有一個ViewPager的內容由FragmentPagerAdapter給出(提供由圖像組成的碎片)。ViewPager + FragmentPagerAdapter在DialogFragment中獲取「IllegalArgumentException:沒有發現視圖...」

:從FragmentActivity顯示當ViewPager + FragmentPagerAdapter,但出現以下情況例外從FragmentDialog這樣做時

代碼工作完美「拋出:IllegalArgumentException:未找到ID爲0x7f040077片段SimpleFragment觀點......」

這是我的代碼:

SherlockFragmentActivity帶有一個按鈕來創建和顯示對話框。

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

這是非常簡單的MyFragmentPagerAdapter, 我把僅有的getItem()方法,而空指針檢查:

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

} 

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

} 

更多信息,如果傳遞給適配器(帶有3個整數的int數組)的內容長度爲零,那麼適配器不會嘗試創建任何Fragment,因此對話框顯示正確但爲空(如預期的那樣)。 在充氣時引發SimpleFragment.onCreateView()異常。 異常中引用的id(未找到)對應於ViewPager的ID,在R.layout.simple_fragment中正確定義。

我也嘗試使用AlertDialog.builder構建對話框,並直接使用Dialog()構造函數,但得到相同的行爲。

+0

我有完全相同的問題...你有沒有發現任何解決方法? – brk3

回答

63

試試這個:

類AchGalleryDialog

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

代替

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

正因爲如此:

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

希望這會有所幫助!

+1

這個工程!太感謝了。 – brk3

+0

謝謝70sCommander,它的偉大我成爲這個問題前幾天比新的SDK到達 – juanmeanwhile

+1

不,問題...在這裏有同樣的問題,看到這個職位。 – 70sCommander

相關問題