jua*_*ile 35 android android-fragments android-viewpager fragmentpageradapter android-nested-fragment
我试图显示一个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");
   }
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()方法,而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的int数组)的长度为零,则适配器不会尝试创建任何片段,因此对话框会正确显示但是为空(如预期的那样).在膨胀时,SimpleFragment.onCreateView()会抛出异常.异常中引用的id(未找到)对应于ViewPager的id,并在R.layout.simple_fragment中正确定义.
我还尝试使用AlertDialog.builder构建Dialog,也直接使用Dialog()构造函数构建Dialog,但获得相同的行为.
70s*_*der 81
试试这个:
在AchGalleryDialog课堂上
MyFragmentAdapter adapter = new MyFragmentAdapter(getChildFragmentManager(),images);
代替
MyFragmentAdapter adapter = new MyFragmentAdapter(getFragmentManager(),images); 
因为这:
http://developer.android.com/about/versions/android-4.2.html#NestedFragments
希望这会有所帮助!
| 归档时间: | 
 | 
| 查看次数: | 18438 次 | 
| 最近记录: |