私は、FragmentPagerAdapter (画像で構成されるフラグメントを提供する) によってコンテンツが提供される ViewPager がある FragmentDialog (ビュー階層のコンテンツとして追加されるのではなく、ダイアログとして作成および表示される) を表示しようとしています。
このコードは、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 配列) の長さが 0 の場合、アダプタはフラグメントを作成しようとしないため、ダイアログは正しく表示されますが、空になります (予想どおり)。例外は、膨張時に SimpleFragment.onCreateView() でスローされます。例外で参照される ID (見つからない) は、ViewPager の ID に対応し、R.layout.simple_fragment で適切に定義されています。
AlertDialog.builder を使用してダイアログを構築したり、Dialog() コンストラクターを使用して直接ダイアログを構築したりしてみましたが、同じ動作になります。
ベストアンサー1
これを試して:
クラスでAchギャラリーダイアログ
MyFragmentAdapter adapter = new MyFragmentAdapter(getChildFragmentManager(),images);
の代わりに
MyFragmentAdapter adapter = new MyFragmentAdapter(getFragmentManager(),images);
このため:
http://developer.android.com/about/versions/android-4.2.html#ネストフラグメント
これが役に立つことを願っています!