39

我试图显示一个 FragmentDialog (创建并显示为一个对话框,而不是作为视图层次结构中的内容添加),其中有一个 ViewPager,其内容由 FragmentPagerAdapter 给出(提供由图像组成的片段)。

该代码在从 FragmentActivity 显示 ViewPager + FragmentPagerAdapter 时完美运行,但在从 FragmentDialog 执行此操作时会出现以下异常:

“IllegalArgumentException:没有为片段 SimpleFragment 找到 id 0x7f040077 的视图...”

这是我的代码:

一个带有按钮的 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");
   }

片段对话框:

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() 方法,并且 nullPointer 检查:

@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 数组)的长度为零,则适配器不会尝试创建任何片段,因此对话框正确显示但为空(如预期的那样)。膨胀时在 SimpleFragment.onCreateView() 抛出异常。异常中引用的 id(未找到)对应于 ViewPager 的 id,并在 R.layout.simple_fragment 中正确定义。

我还尝试使用 AlertDialog.builder 以及直接使用 Dialog() 构造函数构建 Dialog,但得到相同的行为。

4

1 回答 1

82

试试这个:

在课堂上 AchGalleryDialog

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

代替

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

因为这:

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

希望这会有所帮助!

于 2012-12-03T13:21:12.277 回答