ビューに追加しようとしているフラグメントがあります。
FragmentManager fragMgr=getSupportFragmentManager();
feed_parser_activity content = (feed_parser_activity)fragMgr
.findFragmentById(R.id.feedContentContainer);
FragmentTransaction xaction=fragMgr.beginTransaction();
if (content == null || content.isRemoving()) {
content=new feed_parser_activity(item.getLink().toString());
xaction
.add(R.id.feedContentContainer, content)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null)
.commit();
Log.e("Abstract", "DONE");
}
このコードが実行されると、デバッグ中に以下のエラーが発生します。
Java.lang.IllegalArgumentException: No view found for id 0x7f080011
for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}
feed_parser_activity
は、xmlのFragment layoutに設定されているFragmentです。feed_parser_layout
を保持しているFragment LayoutをホストするためにFragmentActivityを使用しています。
私はこれを上で正しくコーディングしていますか?
FragmentActivityのsetContentView()
メソッドのonCreate()
で間違ったレイアウトを指定したことに気付くまで、私もこの問題を抱えていました。
FragmentTransaction.add()
に渡されるID、あなたの場合はR.id.feedContentContainer
は、setContentView()
で指定されたレイアウトの子でなければなりません。
あなたは私たちにあなたのonCreate()
メソッドを見せなかったので、おそらくこれは同じ問題です。
このエラーは、フラグメントを入れ子にして、getChildFragmentManager()ではなくgetSupportFragmentManager()で追加した場合にも発生します。
解決策はgetChildFragmentManager()
を使うことでした
getFragmentManager()
の代わりに
フラグメントから呼び出すときアクティビティからメソッドを呼び出す場合はgetFragmentManager()
を使用してください。
これで問題は解決します。
この問題は(コードでUIを構築するときに)発生し、IDが設定されていないViewPager
(Fragment
sが表示された)が原因で発生したため、単にpager.setID(id)
を使用して動作しました。
このページ は、それを理解するのに役立ちました。
私が会ったもう一つのシナリオ。ネスト化されたフラグメントを使用する場合は、フラグメント内のViewPagerとそのページもフラグメントと言います。
あなたが内側のフラグメント(ViewPagerのページ)でフラグメントトランザクションをするとき、あなたは必要となるでしょう
FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ここではgetActivity()が重要です。 ...
私がこの問題を抱えていたときに私のために働いていたこのスレッドに似た別のスレッドで読んだ答えはレイアウトxmlを含みました。
あなたのlogcatは "ID 0x7f080011のビューが見つかりません"と言っています。
gen->package->R.Java->id
を開き、id 0x7f080011
を探します。
この問題が発生したとき、このIDは私のactivity_main.xml
ファイルのFrameLayout
に属していました。
FrameLayoutにIDがありませんでした(ステートメントAndroid:id = "blablabla"
はありませんでした)。
すべてのレイアウト内のすべてのコンポーネント、特にlogcatで引用されているコンポーネントにIDがあることを確認してください。
com.Android.support:support-v4:21.0.0
からcom.Android.support:support-v4:22.1.1
にアップグレードしたときにこのエラーが発生しました。
私はこれから私のレイアウトを変更しなければなりませんでした:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/container_frame_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
</FrameLayout>
これに:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<FrameLayout
Android:id="@+id/container_frame_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
</FrameLayout>
</FrameLayout>
だからレイアウト しなければならない 子ビューを持っています。私は彼らが新しい図書館でこれを実施したと思います。
この例外は、あなたがFragmentTransaction.replace(int ID, fragment)
に渡しているレイアウトIDが、膨張している他のレイアウトに存在する場合にも起こり得ます。レイアウトIDが一意であることを確認してください。
私の場合は、ポケットベルを含むDialogFragmentを表示しようとしていましたが、FragmentPagerAdapterがフラグメントをポケットベルに追加しようとしたときにこの例外がスローされました。 howettlの回答に基づいて、私はそれがPagerの親が私のFragmentActivityのsetContentView()で設定されたビューではなかったことが原因であったと思います。
この問題を解決するために行った唯一の変更は、getChildFragmentManager()を呼び出して取得したFragmentMagerを渡すFragmentPagerAdapterを作成することでした。通常のgetFragmentManager()を呼び出して取得したものではありません。
public class PagerDialog extends DialogFragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.pager_dialog, container, false);
MyPagerAdapter pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
return rootView;
}
}
私はこれが1つのシナリオのためにすでに答えられたことを知っています、しかし、私の問題はわずかに異なっていました、そして私は他の誰かが私の靴にいるならば私が共有すると思いました。
私はonCreate()
内でトランザクションを作成していましたが、この時点ではビューツリーは膨張していないので、これと同じエラーが発生します。トランザクションコードをonResume()
に入れることで、すべてうまくいきました。
そのため、ビューツリーが膨張した後にトランザクションコードが実行されるようにしてください。
私は同じ問題を抱えていましたが、私の問題は向きの変化に起こっていました。他の解決策はどれもうまくいきませんでした。そのため、画面サイズに基づいて2ペインまたは1ペインのレイアウトを作成するときに、フラグメントからsetRetainInstance(true);
を削除するのを忘れていました。
Recycler View内でViewpagerを使用すると、厄介なエラーが発生しました。以下のエラー私は特別な状況に直面しました。私は(FragmentStatePagerAdapterを使って)ViewpagerでRecyclerViewを持つフラグメントを始めました。 RecyclerViewでセルをクリックして別のフラグメントに切り替えてから、電話のハードウェアの[戻る]ボタンを使用して戻るようにナビゲートしてアプリケーションがクラッシュするまで、うまく機能しました。
そしてこれについて面白いのは、同じRecyclerViewに2つのViewpagerがあり、どちらも約5セル離れていたということでした(その他は画面に表示されず、停止していました)。そのため、最初は最初のViewpagerにSolutionを適用し、他のViewpagerをそのまま残しました(ViewpagerはFragmentsを使用)。
最初のビューページャーが表示されていたときに戻ることはうまくいきました。今私が2番目のものまでスクロールしてそれからフラグメントを変更して戻ったとき、それはクラッシュしました(同じことが最初のもので起こりました)。だから私は両方のViewpagerを変更しなければなりませんでした。
とにかく、解決策を見つけるために以下を読んでください。下記のクラッシュエラー:
Java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
デバッグに費やした時間。私がchildFragmentManagerに合格していることを確認するなど、すべての解決策を適用して、このスレッドの投稿全体を最後まで読んでください。
何もうまくいきませんでした。
最後に、FragmentStatePagerAdapterを使用する代わりに、PagerAdapterを拡張し、フラグメントを使用せずにViewpagerで使用しました。フラグメントが入れ子になったバグがあるところもあると思います。とにかく、選択肢があります。読む...
以下のリンクはとても役に立ちました。
リンクが切れる可能性があるので、私が実装したソリューションを以下に掲載します。
public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;
// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
//super(fm);
this.mContext = mContext;
this.productDetails = productDetails;
}
// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
LayoutInflater inflater = LayoutInflater.from(mContext);
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);
imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
String url = null;
if (imagelists != null) {
url = imagelists.get(position).getImage();
}
// This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);
// Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
container.addView(layout);
return layout;
}
// Write as it is. I don't know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
/*super.destroyItem(container, position, object);*/
}
// Get the count
@Override
public int getCount() {
int size = 0;
if (productDetails != null) {
imagelists = productDetails.getImagelist();
if (imagelists != null) {
size = imagelists.size();
}
}
Log.d(TAG,"Adapter Size = "+size);
return size;
}
// Write as it is. I don't know much about it
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
これが役に立ったことを願っています!
私の間違いはFragamentTransaction
です。
私はt.replace(R.layout.mylayout);
の代わりにこのt.replace(R.id.mylayout);
をやっていました
違いは、1つはレイアウトであり、もう1つはlayout(id)
への参照です。
ネストされたフラグメントを使用する
getChildFragmentManager()
解決されたクラッシュの代わりにgetActivity.getSupportFragmentManager()
を使用することでクラッシュします。
万が一誰かが私がしたのと同じばかげた間違いをしたのだ。アクティビティの内容がどこかに上書きされていないことを確認します(つまり、setContentViewへの追加の呼び出しを探します)。
私の場合は、不注意なコピーと貼り付けのために、アクティビティの状態を乱すDataBindingUtil.inflateではなく、DataBindingUtil.setContentViewをフラグメントに使用しました。
このページは、Fragment IllegalArgumentExceptionに関する提案を投稿するための中心的な場所です。これがあなたが試すことができるもう一つのことです。これがついに私のために働いたものです:
横向きのレイアウトファイルが別にあることを忘れていました。 FrameLayoutコンテナーをそこに追加した後も、フラグメントは機能しました。
別のメモとして、このページ(およびインターネット全体)で他にも提案されていることをすべて試してから数時間かけて髪を引き抜いてきた場合は、これらの面倒な断片をダンプして古き良き標準レイアウトに戻ることを検討してください。 (それが実際に私が私の問題を最後に発見したときに私がしていた過程にあったものです。)あなたはまだコンテナの概念を使うことができます。ただし、フラグメントで埋め込む代わりに、xml include
タグを使用して、フラグメントで使用したのと同じレイアウトで埋め込むことができます。あなたはあなたのメインレイアウトでこのようなことをすることができます:
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<include layout="@layout/former_fragment_layout" />
</FrameLayout>
former_fragment_layout
は、フラグメントで使用しようとしていたxmlレイアウトファイルの名前です。詳細については、 include を使用したレイアウトの再利用を参照してください。
私はこれと同じ問題を抱えていました、あなたがすべてそれを見ることができるように私が私のコードを投稿させてください、そして私がしたのと同じことをしないでください。
@Override
protected void onResume()
{
super.onResume();
fragManager = getSupportFragmentManager();
Fragment answerPad=getDefaultAnswerPad();
setAnswerPad(answerPad);
setContentView(R.layout.abstract_test_view);
}
protected void setAnswerPad(AbstractAnswerFragment pad)
{
fragManager.beginTransaction()
.add(R.id.AnswerArea, pad, "AnswerArea")
.commit();
fragManager.executePendingTransactions();
}
私はsetContentView
の前にフラグメントを設定していたことに注意してください。おっと.
私の場合は、リサイクラービューアイテムにSupportMapFragmentを使用していました(私は、マップをインタラクティブではない、ほとんど静止画像のように見せるオーバーヘッドの少ない "liteMode"を使用していました)。私は正しいFragmentManagerを使用していました、そしてすべてがうまくいくように見えました…小さなリストで。項目のリストが画面の高さを少し超えると、スクロール時にこの問題が発生し始めました。
XMLで静的に宣言しようとしたときに抱えていた問題を回避するために、動的なSupportMapFragmentを別のフラグメントの内側にあるビューの内側に挿入していたためです。このため、フラグメントプレースホルダレイアウトは、ビューがウィンドウにアタッチされたとき、つまり画面上に表示されたときにのみ、実際のフラグメントと置き換えることができました。そのため、SupportMapFragmentを初期化し、Fragment置換を行い、onAttachedToWindowイベントでgetMapAsync()を呼び出すためのコードを追加しました。
忘れていたのは、コードが2回実行されないようにすることでした。すなわちonAttachedToWindowイベントで、新しいSupportMapFragmentインスタンスがまだnullであるかどうかを確認してから、新しいインスタンスを作成し、Fragment置換を実行します。アイテムがRecyclerViewの上部からはみ出ると、ウィンドウから切り離され、次にスクロールバックしたときに再結合されるため、このイベントは複数回発生します。
Nullチェックを追加すると、RecyclerView項目ごとに1回だけ発生し、問題は解決しました。 TL; DR!
Xmlレイアウトファイルを変更した後は、必ずプロジェクトをクリーンアップしてください。
Eclipseの場合:プロジェクト>クリーン
私はこのバグを修正しました。私はcommitNow()
をcommit()
に置き換えます。
mFragment.getChildFragmentManager()
.beginTransaction()
.replace(R.id.main_fragment_container,fragment)
.commitNowAllowingStateLoss();
commitNow
は同期メソッド、commit()
メソッドは非同期メソッドです。
私の場合は、同じレイアウト要素(フラグメントプレースホルダ)に異なるIDを使用しているのに、異なるビルドバリアントには複数のIDを使用しているときに、この例外が送出されました。何らかの理由で、あなたが最初にフラグメントを交換するとき、それは完全にうまくいきます、しかし、あなたがそれをもう一度やろうとするならば、あなたはこの例外を得ます。したがって、異なるビルドバリアントに対して複数のレイアウトがある場合は、必ず同じIDを使用してください。
onCreateView()
でviewを自分のフラグメントに置き換えようとしたときに、この問題が発生しました。このような:
public class MyProjectListFrag extends Fragment {
private MyProjectListFragment myProjectListFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
FragmentManager mFragmentManager = getFragmentManager();
myProjectListFragment = new MyProjectListFragment();
mFragmentManager
.beginTransaction()
.replace(R.id.container_for_my_pro_list,
myProjectListFragment, "myProjectListFragment")
.commit();
}
それは私に言った
11-25 14:06:04.848: E/AndroidRuntime(26040): Java.lang.IllegalArgumentException: No view found for id 0x7f05003f (com.example.myays:id/container_for_my_pro_list) for fragment MyProjectListFragment{41692f40 #2 id=0x7f05003f myProjectListFragment}
それから私はreplaceをonActivityCreated()
に入れることでこの問題を修正しました。このような:
public class MyProjectListFrag extends Fragment {
private final static String TAG = "lch";
private MyProjectListFragment myProjectListFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater
.inflate(R.layout.frag_my_project_list, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
FragmentManager mFragmentManager = getFragmentManager();
myProjectListFragment = new MyProjectListFragment();
mFragmentManager
.beginTransaction()
.replace(R.id.container_for_my_pro_list,
myProjectListFragment, "myProjectListFragment")
.commit();
}
onCreateView()
で返す必要があります。onActivityCreated()
のように、フラグメントリフトサイクルの次の関数でこのビューに対する操作を追加できます。お役に立てれば!
これは、他のフラグメントの中のフラグメントから呼び出しているときに起こります。
つかいます :
getActivity().getSupportFragmentManager().beginTransaction();
フラグメント内のフラグメントをfragmentManager
で置き換えようとしているが、あなたが 親フラグメントを膨らませていない である場合、問題を引き起こす可能性があります。
BaseFragment.Java OnCreateView
:
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new DifferentFragment())
.commit();
}
return super.onCreateView(inflater, container, savedInstanceState);
フラグメントの正しいレイアウトを展開することでsuper.onCreateView(inflater, container, savedInstanceState);
を置き換えます:
return inflater.inflate(R.layout.base_fragment, container, false);
この問題は、<include layout="@layout/your_fragment_layout"/>
をapp_bar_main.xml
に入れないと発生します。
アクティビティの作成中にフラグメントトランザクションを実行していたときにも同じ問題がありました。
核となる問題は、 Nickはすでに指摘している - ビューツリーがまだ膨張していないことです。しかし彼の解決策はうまくいきませんでした - onResumeやonPostCreateなどでも同じ例外です。
解決策は、コンテナフラグメントにコールバックを追加して準備ができたことを知らせることです。
public class MyContainerFragment extends Fragment {
public static interface Callbacks {
void onMyContainerAttached();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "--- onAttach");
((Callbacks) activity).onMyContainerAttached();
}
//... rest of code
}
そして活動中:
public class MainActivity extends Activity
implements MyContainerFragment.Callbacks
{
@Override
public void onMyContainerAttached() {
getFragmentManager()
.beginTransaction()
.replace(R.id.containerFrame, new MyFragment())
.commit();
}
//...
}
私は同じ問題を抱えていた、私の過ちは私が活動の他のレイアウト(他の言語用)にframlayout xmlコードを追加するのを忘れていたことです。私のアプリは多言語用に作られていたので、私はすべてのアクティビティに対して2つのレイアウトを用意しました。右から左へ、そして左から右へ
私の場合は、リストビューアダプタクラスを宣言するためにフラグメントクラスファイルを使用していました。パブリックアダプタクラスに別のファイルを使用したところ、エラーがなくなりました。
フラグメントのためのコンテナーそれはあなたがフラグメントを置き換えようとしているフレームレイアウトまたはレイアウトを意味します、それは問題を引き起こします、助けを願います
ハッピーコーディング!
同じIDを持つ2つのフラグメントに2つのビューがある場合も同様です。
コンテナレイアウトをアクティビティに追加する前にフラグメントを追加しようとしたのと同じ問題が発生しました。