322

ビューに追加しようとしているフラグメントがあります。

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_activityxml で Fragment レイアウトに設定されている Fragment です。
FragmentActivity を使用して、feed_parser_layout.
上記でこれを正しくコーディングしていますか?

4

40 に答える 40

434

FragmentActivitysetContentView()のメソッドで間違ったレイアウトを指定したことに気付くまで、私もこの問題を抱えていました。onCreate()

FragmentTransaction.add()あなたの場合、 に渡される id は、 でR.id.feedContentContainer指定されたレイアウトの子でなければなりませんsetContentView()

あなたはあなたのonCreate()方法を私たちに示していないので、おそらくこれは同じ問題です.

于 2011-11-16T21:23:49.247 に答える
331

このエラーは、ネストされたフラグメントがあり、getChildFragmentManager() の代わりに getSupportFragmentManager() を使用してそれらを追加した場合にも発生します。

于 2013-08-09T12:08:42.793 に答える
31

私はこの問題を抱えていました (私の UI をコードで構築するとき)、それは私のViewPager( Fragments を示した) ID が設定されていないことが原因でしpager.setID(id)た。

このページは私がそれを理解するのを助けました。

于 2012-09-19T15:41:43.567 に答える
21

私の場合、ページャーを含む DialogFragment を表示しようとしましたが、FragmentPagerAdapter がページャーにフラグメントを追加しようとしたときに、この例外がスローされました。howettl の回答に基づいて、Pager の親が FragmentActivity の setContentView() で設定されたビューではなかったことが原因だと思います。

問題を解決するために私が行った唯一の変更は、通常のように getFragmentManager() を呼び出して取得したものではなく、getChildFragmentManager() を呼び出して取得した FragmentMager を渡す FragmentPagerAdapter を作成することでした。

    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;
    }
}
于 2013-04-11T17:12:13.147 に答える
16

FragmentTransaction.replace(int ID, fragment)この例外は、渡すレイアウト IDがインフレートされている他のレイアウトに存在する場合にも発生する可能性があります。レイアウト ID が一意であり、機能することを確認してください。

于 2012-09-30T09:31:14.860 に答える
15

この問題がレイアウトxmlに関係していたときに私のために働いた、これと同様の別のスレッドで読んだ答え。

あなたのlogcatは「ID 0x7f080011のビューが見つかりません」と言っています。

を開きgen->package->R.java->id、 id を探します0x7f080011

この問題が発生したとき、この ID はファイル内の aFrameLayoutに属していました。activity_main.xml

FrameLayout に ID がありませんでした (ステートメントがありませんでしたandroid:id = "blablabla")。

すべてのレイアウトのすべてのコンポーネント、特に logcat で引用されているコンポーネントに ID があることを確認してください。

于 2013-05-30T18:39:20.477 に答える
9

これは 1 つのシナリオで既に回答されていることは知っていますが、私の問題は少し異なり、他の誰かが私の立場にある場合に備えて共有したいと思いました。

内でトランザクションを行ってonCreate()いましたが、この時点ではビュー ツリーが拡張されていないため、同じエラーが発生します。トランザクション コードを入力すると、onResume()すべてが正常に実行されました。

したがって、ビュー ツリーが膨張した後にトランザクション コードが実行されることを確認してください。

于 2012-09-04T03:27:55.390 に答える
8

Recycler View 内で Viewpager を使用すると、厄介なエラーが発生しました。以下のエラーは、特別な状況で直面しました。Viewpager(FragmentStatePagerAdapterを使用)でRecyclerViewを持つフラグメントを開始しました。RecyclerView でセルをクリックして別のフラグメントに切り替え、電話のハードウェアの [戻る] ボタンを使用して戻るとアプリがクラッシュするまではうまくいきました。

そして、これについて面白いのは、同じ RecyclerView に 2 つの Viewpager があり、両方とも約 5 セル離れていたことです (他は画面に表示されず、ダウンしていました)。そのため、最初にソリューションを最初のビューページャーに適用し、他のビューページャーをそのまま残しました(フラグメントを使用するビューページャー)。

最初のビューページャーが表示可能だったとき、ナビゲートバックは正常に機能しました。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;
}

}

これが役に立ったことを願っています!!

于 2015-10-14T17:58:08.193 に答える
7

私は同じ問題を抱えていましたが、向きの変更で問題が発生していました。他の解決策はどれも機能しませんでした。setRetainInstance(true);そのため、画面サイズに基づいて 2 つまたは 1 つのペイン レイアウトを行うときに、フラグメントから削除するのを忘れていたことがわかりました。

于 2014-01-05T19:40:19.307 に答える
5

私の間違いはにありましたFragamentTransaction

t.replace(R.layout.mylayout);私は代わりにこれをやっていたt.replace(R.id.mylayout);

違いは、1 つはレイアウトであり、もう 1 つはへの参照であることです。layout(id)

于 2013-11-12T12:50:28.087 に答える
3

これと同じ問題が発生しました。コードを投稿して、すべての人がそれを確認できるようにします。私が行ったのと同じことはしません。

@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。おっと。

于 2012-11-22T02:06:57.967 に答える
3

このページは、Fragment IllegalArgumentException に関する提案を投稿するための中心的な場所のようです。ここで、もう 1 つ試すことができます。これが最終的に私のために働いたものです:

横向き用の別のレイアウト ファイルがあることを忘れていました。そこにも FrameLayout コンテナを追加した後、フラグメントは機能しました。


別のメモとして、このページ (およびインターネット全体) で提案されている他のすべてを既に試し、何時間も髪を引っ張っている場合は、これらの迷惑なフラグメントを破棄して、古き良き標準レイアウトに戻ることを検討してください。(最終的に自分の問題を発見したとき、それは実際に私が行っていたことです。) コンテナーの概念は引き続き使用できます。ただし、フラグメントで埋める代わりに、xmlincludeタグを使用して、フラグメントで使用したのと同じレイアウトで埋めることができます。メイン レイアウトで次のようなことができます。

<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 を使用したレイアウトの再利用を参照してください。

于 2015-01-02T08:34:23.530 に答える
2

私の場合、リサイクラー ビュー アイテムに SupportMapFragment がありました (ほとんど静的なイメージのように、マップを非インタラクティブに表示するオーバーヘッドの低い「liteMode」を使用していました)。私は正しい FragmentManager を使用していましたが、すべて正常に動作しているように見えました...小さなリストで。アイテムのリストが画面の高さを少し超えると、スクロール時にこの問題が発生し始めました。

結局のところ、XML で静的に宣言しようとしたときに発生していたいくつかの問題を回避するために、別のフラグメント内にあるビュー内に動的な SupportMapFragment を挿入していたことが原因でした。このため、フラグメント プレースホルダー レイアウトは、ビューがウィンドウにアタッチされた後、つまり画面に表示された後にのみ、実際のフラグメントに置き換えることができました。そのため、onAttachedToWindow イベントで SupportMapFragment を初期化し、Fragment を置換し、getMapAsync() を呼び出すためのコードを配置しました。

私が忘れていたのは、コードが 2 回実行されないようにすることでした。つまり、onAttachedToWindow イベントで、新しいインスタンスを作成して Fragment 置換を実行する前に、動的な SupportMapFragment がまだ null であるかどうかを確認します。アイテムが RecyclerView の上部から外れると、ウィンドウから切り離され、スクロールして戻ったときに再接続されるため、このイベントは複数回発生します。

null チェックを追加すると、RecyclerView アイテムごとに 1 回だけ発生し、問題は解消されました。TL;DR!

于 2017-01-11T23:32:00.960 に答える
1

ビューを のフラグメントに置き換えようとしたときに、この問題が発生しましたonCreateView()。このような:

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}

次に、置換を に入れることでこの問題を修正しました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();

    }
  1. onCreateView()後で置き換えることができるように、ビューを返す必要があります
  2. 次のように、fragment liftcycle の次の関数で、このビューに対する任意の操作を配置できます。onActivityCreated()

お役に立てれば!

于 2014-11-25T06:25:06.683 に答える
0

アクティビティの作成中にフラグメント トランザクションを実行していたときに、同じ問題が発生しました。

中心的な問題は、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();
    }

    //...
}
于 2015-03-05T05:14:29.960 に答える
0

フラグメント内のフラグメントを に置き換えようとしている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);
于 2015-02-24T08:52:31.180 に答える