web-dev-qa-db-ja.com

AndroidのフラグメントIDのビューが見つかりませんか?

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

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を使用しています。
私はこれを上で正しくコーディングしていますか?

248

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

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

あなたは私たちにあなたのonCreate()メソッドを見せなかったので、おそらくこれは同じ問題です。

331
howettl

このエラーは、フラグメントを入れ子にして、getChildFragmentManager()ではなくgetSupportFragmentManager()で追加した場合にも発生します。

236
Malachiasz

解決策はgetChildFragmentManager()を使うことでした

getFragmentManager()の代わりに

フラグメントから呼び出すときアクティビティからメソッドを呼び出す場合はgetFragmentManager()を使用してください。

これで問題は解決します。

58
Sterling Diaz

この問題は(コードでUIを構築するときに)発生し、IDが設定されていないViewPagerFragmentsが表示された)が原因で発生したため、単にpager.setID(id)を使用して動作しました。

このページ は、それを理解するのに役立ちました。

28
kaka

私が会ったもう一つのシナリオ。ネスト化されたフラグメントを使用する場合は、フラグメント内のViewPagerとそのページもフラグメントと言います。

あなたが内側のフラグメント(ViewPagerのページ)でフラグメントトランザクションをするとき、あなたは必要となるでしょう

FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

ここではgetActivity()が重要です。 ...

25
zdd

私がこの問題を抱えていたときに私のために働いていたこのスレッドに似た別のスレッドで読んだ答えはレイアウトxmlを含みました。

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

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

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

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

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

12
scottyseus

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> 

だからレイアウト しなければならない 子ビューを持っています。私は彼らが新しい図書館でこれを実施したと思います。

11
ono

この例外は、あなたがFragmentTransaction.replace(int ID, fragment)に渡しているレイアウトIDが、膨張している他のレイアウトに存在する場合にも起こり得ます。レイアウトIDが一意であることを確認してください。

11
ealihodzic

私の場合は、ポケットベルを含む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;
    }
}
9
garibay

私はこれが1つのシナリオのためにすでに答えられたことを知っています、しかし、私の問題はわずかに異なっていました、そして私は他の誰かが私の靴にいるならば私が共有すると思いました。

私はonCreate()内でトランザクションを作成していましたが、この時点ではビューツリーは膨張していないので、これと同じエラーが発生します。トランザクションコードをonResume()に入れることで、すべてうまくいきました。

そのため、ビューツリーが膨張した後にトランザクションコードが実行されるようにしてください。

7
Nick

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

7
VM4

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で使用しました。フラグメントが入れ子になったバグがあるところもあると思います。とにかく、選択肢があります。読む...

以下のリンクはとても役に立ちました。

フラグメントのない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;
}

}

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

6
Nilesh

私の間違いはFragamentTransactionです。

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

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

5
mut tony

ネストされたフラグメントを使用する

getChildFragmentManager()解決されたクラッシュの代わりにgetActivity.getSupportFragmentManager()を使用することでクラッシュします。

5
UdayaLakmal

万が一誰かが私がしたのと同じばかげた間違いをしたのだ。アクティビティの内容がどこかに上書きされていないことを確認します(つまり、setContentViewへの追加の呼び出しを探します)。

私の場合は、不注意なコピーと貼り付けのために、アクティビティの状態を乱すDataBindingUtil.inflateではなく、DataBindingUtil.setContentViewをフラグメントに使用しました。

4
Squimon

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

3
Suragch

私はこれと同じ問題を抱えていました、あなたがすべてそれを見ることができるように私が私のコードを投稿させてください、そして私がしたのと同じことをしないでください。

@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の前にフラグメントを設定していたことに注意してください。おっと.

3
PearsonArtPhoto

私の場合は、リサイクラービューアイテムにSupportMapFragmentを使用していました(私は、マップをインタラクティブではない、ほとんど静止画像のように見せるオーバーヘッドの少ない "liteMode"を使用していました)。私は正しいFragmentManagerを使用していました、そしてすべてがうまくいくように見えました…小さなリストで。項目のリストが画面の高さを少し超えると、スクロール時にこの問題が発生し始めました。

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

忘れていたのは、コードが2回実行されないようにすることでした。すなわちonAttachedToWindowイベントで、新しいSupportMapFragmentインスタンスがまだnullであるかどうかを確認してから、新しいインスタンスを作成し、Fragment置換を実行します。アイテムがRecyclerViewの上部からはみ出ると、ウィンドウから切り離され、次にスクロールバックしたときに再結合されるため、このイベントは複数回発生します。

Nullチェックを追加すると、RecyclerView項目ごとに1回だけ発生し、問題は解決しました。 TL; DR!

2
Breeno

Xmlレイアウトファイルを変更した後は、必ずプロジェクトをクリーンアップしてください。

Eclipseの場合:プロジェクト>クリーン

2
Zafer

私はこのバグを修正しました。私はcommitNow()commit()に置き換えます。

mFragment.getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.main_fragment_container,fragment)
  .commitNowAllowingStateLoss();

commitNowは同期メソッド、commit()メソッドは非同期メソッドです。

1
user1232595

私の場合は、同じレイアウト要素(フラグメントプレースホルダ)に異なるIDを使用しているのに、異なるビルドバリアントには複数のIDを使用しているときに、この例外が送出されました。何らかの理由で、あなたが最初にフラグメントを交換するとき、それは完全にうまくいきます、しかし、あなたがそれをもう一度やろうとするならば、あなたはこの例外を得ます。したがって、異なるビルドバリアントに対して複数のレイアウトがある場合は、必ず同じIDを使用してください。

1
T.K.

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();

    }
  1. 後で置き換えることができるように、ビューをonCreateView()で返す必要があります。
  2. onActivityCreated()のように、フラグメントリフトサイクルの次の関数でこのビューに対する操作を追加できます。

お役に立てれば!

1
Stephen Lin

これは、他のフラグメントの中のフラグメントから呼び出しているときに起こります。

つかいます :

getActivity().getSupportFragmentManager().beginTransaction();
1
Arvin Sanaei

フラグメント内のフラグメントを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);
0
surfer190

この問題は、<include layout="@layout/your_fragment_layout"/>app_bar_main.xmlに入れないと発生します。

0
Bbake Waikhom

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

核となる問題は、 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();
    }

    //...
}
0

私は同じ問題を抱えていた、私の過ちは私が活動の他のレイアウト(他の言語用)にframlayout xmlコードを追加するのを忘れていたことです。私のアプリは多言語用に作られていたので、私はすべてのアクティビティに対して2つのレイアウトを用意しました。右から左へ、そして左から右へ

0
tahaDev

私の場合は、リストビューアダプタクラスを宣言するためにフラグメントクラスファイルを使用していました。パブリックアダプタクラスに別のファイルを使用したところ、エラーがなくなりました。

0
Gauss

フラグメントのためのコンテナーそれはあなたがフラグメントを置き換えようとしているフレームレイアウトまたはレイアウトを意味します、それは問題を引き起こします、助けを願います

ハッピーコーディング!

0
blackHawk

同じIDを持つ2つのフラグメントに2つのビューがある場合も同様です。

0
Hossam Hassan

コンテナレイアウトをアクティビティに追加する前にフラグメントを追加しようとしたのと同じ問題が発生しました。

0
Rohit