web-dev-qa-db-ja.com

java.lang.IllegalArgumentException:フラグメントのID 0x1020002(Android:id / content)のビューが見つかりません

あるフラグメントから別のフラグメントに移動しようとしています。フラグメントトランザクション中に次のエラーが表示されます。

    Java.lang.IllegalArgumentException: No view found for id 0x1020002 (Android:id/content) for fragment PhotosFragment2{41a57218 #3 id=0x1020002}
            at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:930)
            at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1115)
            at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:682)
            at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1478)
            at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:446)
            at Android.os.Handler.handleCallback(Handler.Java:615)
            at Android.os.Handler.dispatchMessage(Handler.Java:92)
            at Android.os.Looper.loop(Looper.Java:153)
            at Android.app.ActivityThread.main(ActivityThread.Java:5086)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:511)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:821)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:584)
            at dalvik.system.NativeStart.main(Native Method)

以下はクラスです。フラグメントトランザクションに次のコードを使用しました。

Fragment fragment = new PhotosFragment2();

                        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                        fragmentTransaction.replace(Android.R.id.content, fragment);
                        fragmentTransaction.commit();

PhotosFragment.Java

   public class PhotosFragment extends Fragment {
        private FragmentActivity myContext;
        @Override
        public void onAttach(Activity activity) {
            myContext = (FragmentActivity) activity;
            super.onAttach(activity);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.photos, container, false);

            rootView.setVerticalScrollBarEnabled(false);
            int[] mThumbIds = {
                    R.drawable.album8, R.drawable.album3,
                    R.drawable.album4, R.drawable.album8,
                    R.drawable.album6, R.drawable.album7,
                    R.drawable.album12, R.drawable.album10,
            };

            int[] mThumbIds2 = {
                    R.drawable.album8, R.drawable.album3,
                    R.drawable.album4,
                    R.drawable.album6, R.drawable.album7,
                    R.drawable.album9, R.drawable.album10,
                    R.drawable.album11, R.drawable.album12, R.drawable.album8,
                    R.drawable.album8, R.drawable.album3,
                    R.drawable.album4,
                    R.drawable.album6, R.drawable.album7,
                    R.drawable.album9, R.drawable.album10,
                    R.drawable.album11, R.drawable.album12, R.drawable.album8,
            };

            CustomGridSingle2 adapter = new CustomGridSingle2(myContext, mThumbIds);
            GridView grid = (GridView)rootView.findViewById(R.id.gridView);
            final ImageView img= (ImageView)rootView.findViewById(R.id.imageView7);
            grid.setFocusable(false);

            grid.setAdapter(adapter);
    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Fragment fragment = new PhotosFragment2();

            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(Android.R.id.content, fragment);
            fragmentTransaction.commit();
        }
    });
            CustomGridSingle2 adapter2 = new CustomGridSingle2(myContext, mThumbIds2);
            GridView grid2 = (GridView)rootView.findViewById(R.id.gridView2);
            grid2.setFocusable(false);
            grid2.setAdapter(adapter2);
            grid2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Fragment fragment = new PhotosFragment2();

                    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.replace(Android.R.id.content, fragment);
                    fragmentTransaction.commit();
                }
            });

            return rootView;
        }


    }

PhotosFragment2.Java

public class PhotosFragment2 extends Fragment {
    private FragmentActivity myContext;
    @Override
    public void onAttach(Activity activity) {
        myContext = (FragmentActivity) activity;
        super.onAttach(activity);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View rootView = inflater.inflate(R.layout.photos2, container, false);
        myContext.getActionBar().hide();
        return rootView;
    }
}

アクティビティxmlファイル

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">


    <FrameLayout
        Android:id="@+id/frame_container"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <LinearLayout
        Android:id="@+id/left_drawer_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:background="@drawable/bgmenu"
        Android:orientation="vertical">

        <RelativeLayout
            Android:id="@+id/profilelayout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="0"
            Android:paddingTop="10dp">


            <ImageView
                Android:id="@+id/drawer_profile_image"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignBottom="@+id/drawer_profile_background"
                Android:layout_alignLeft="@+id/drawer_profile_background"
                Android:layout_alignRight="@+id/drawer_profile_background"
                Android:layout_alignTop="@+id/drawer_profile_background"
                Android:layout_marginBottom="7.667dp"
                Android:layout_marginLeft="6.5dp"
                Android:layout_marginRight="8.3dp"
                Android:layout_marginTop="7.667dp"
                Android:scaleType="centerCrop"></ImageView>


            <ImageView
                Android:id="@+id/drawer_profile_background"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_centerHorizontal="true"
                Android:scaleType="centerCrop"
                Android:src="@drawable/profileblock">

            </ImageView>

            <ImageView
                Android:id="@+id/settingicon"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignBottom="@+id/drawer_profile_background"
                Android:layout_marginLeft="-15dp"
                Android:layout_toRightOf="@+id/drawer_profile_background"
                Android:background="@drawable/settings" />

            <textview
                Android:id="@+id/username"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/drawer_profile_background"
                Android:layout_centerHorizontal="true"
                Android:layout_marginTop="5dp"
                Android:text="Name"
                Android:textAppearance="?android:attr/textAppearanceListItemSmall"
                Android:textColor="@Android:color/white" />


        </RelativeLayout>


        <ListView
            Android:id="@+id/list_slidermenu"
            style="@style/buttonStyle"
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_marginTop="30dp"
            Android:layout_weight="2"
            Android:cacheColorHint="@Android:color/transparent"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="1dp"
            Android:listSelector="@Android:color/transparent"
            Android:scrollbars="none" />

    </LinearLayout>
</Android.support.v4.widget.DrawerLayout>
31

fragmentTransaction.replace(R.id.container,fragment)を使用すると、既にコンテナ内にあるフラグメントがすべて削除され、新しいコンテナが同じコンテナに追加されます。

今、私はあなたに2つのことを提案することができます。最初に、あなたが今しているfragmentTransaction.replace(Android.R.id.content, fragment);を使用したい場合、Activityを使用してsetContentViewのコンテンツを設定しないでくださいこれで問題なく動作するはずです。正確にAndroid.R.id.contentを知るには、参照することができます このstackoverflowの質問と回答

または、2番目に、Activityのレイアウトに、FrameLayoutというIDを持つcontentがあります。そして使用する

fragmentTransaction.replace(R.id.content, fragment);  
fragmentTransaction.addToBackStack(null);//add the transaction to the back stack so the user can navigate back
// Commit the transaction
fragmentTransaction.commit();  

お役に立てれば。

詳細:

あなたのコメントから、FrameLayoutのレイアウト(Activityのレイアウトではない)でFragmentを使用するというアイデアを得るのに問題があるようです。 ドキュメント

FrameLayoutは、画面上の領域をブロックして単一のアイテムを表示するように設計されています。通常、FrameLayoutは単一の子ビューを保持するために使用する必要があります。子が互いに重なり合わないように、さまざまな画面サイズにスケーラブルな方法で子ビューを整理することは難しいためです。

したがって、FrameLayoutの主な目的は、最大の子ビューに適合するために必要な領域をブロックすることです。 FrameLayoutFragmentコンテナとして使用する場合は、最大のFragmentのレイアウトを収容するためのスペースを常に確保することができます。

FrameLayoutのレイアウトxmlファイルにActivityのようなものを含めることができます

<FrameLayout
    Android:id="@+id/content"
    Android:layout_height="match_parent"
    Android:layout_width="match_parent">
 <!--you can put your existing views of your current xml here, so yes your entire xml is now inside this FrameLayout -->
</FrameLayout>
26
Sash_KP

getSupportFragmentManager()は使用しません。私はgetChildFragmentManager()を使用し、それは私のために働いた。あなたはそれを試すことができます。

19
NhatVM

FragmentFragmentに入れようとする場合は、getChildFragmentManager()を使用します

14
Andrei Tr.

ViewPagerを使用している場合、ページャーアダプターにgetChildFragmentManager()を使用します。

viewPager.setAdapter(new ItemsAdapter(getChildFragmentManager()));
6
georgehardcore

PhotosFragmentが添付されるアクティビティのコンテンツビューを設定する必要があります。

protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_main);

    //...
}
4
John Cordeiro

この問題には2つの最も一般的な理由があります

  1. OnCreate()メソッドのsetContentView()で間違ったレイアウトを指定する
  2. ネストされたFragmentsがあり、getChildFragmentManager()の代わりにgetSupportFragmentManager()でそれらを追加するときにもエラーが発生します。

これが役立つことを願って

要約

3
Summved Jain

私はこれが非常に遅いことを知っています。しかし、それは他の人のために働くかもしれません。

(3行目)のように、各レイアウトのIDを宣言しました

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/container"
1
Bahu

Android 4.2(API 17)ネストされたフラグメントが使用可能になるため。 this を参照してください

フラグメントを他のフラグメント内に配置するには、getChildFragmentManager()を使用します

サポートライブラリでも利用可能。

1
Akbar

問題は、フラグメントを追加し、次のようなフラグメントにbeginTransactionを追加することです。

_getFragmentManager().beginTransaction().replace(Android.R.id.content, ImageBrowseFragment.newInstance(bundle),"ImageBrowseFragment")
            .addToBackStack(null).commit();
_

getFragmentManager()getActivity().getSupportFragmentManager()に変更するだけです

その後、すべてがうまくいきます

フラグメントにフラグメントを追加するときは、_Android.R.id.content_または_Window.ID_Android_CONTENT_を使用します。アクティビティではなく、フラグメントのルートコンテナを表していると思います。 getActivity().getSupportFragmentManager()に変更するとうまくいきます

0
Bruce too

この回答は、フラグメントをネストするとき、またはアクティビティをフラグメントに変換するときに発生する愚かな間違いを強調しています。

フラグメント内のフラグメントをfragmentManagerで置き換えようとしているが、親フラグメントを膨張させていないである場合、問題が発生する可能性があります。

BaseFragment.JavaOnCreateView

_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

次のコードブロックをPhotosFragment2のonCreateViewメソッドに追加します。

View rootView = inflater.inflate(R.layout.photos2, null);

の代わりに:

View rootView = inflater.inflate(R.layout.photos2, container, false);
0
John Cordeiro

同じエラーが発生し、多くのことを試した後、問題は「id」と「getActivity()。getSupportFragmentManager()」にあることがわかりました。

これらを実装する前に

txt_more.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    getChildFragmentManager()
                            .beginTransaction()
                            .replace(R.id.content_frame, new OpportunitiesFragment())
                            .commit();                }

            });

次に、これらに変更しました

 txt_more.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
    ## Heading ##
                        getActivity().getSupportFragmentManager()
                                .beginTransaction()
                                .replace(Android.R.id.content, new OpportunitiesFragment())
                                .commit();                }
                });
0
pavithra

私の場合、私は変えなければなりませんでした

ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
                container);

ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
                container, false);
0
Omid Aminiva

フラグメント(ページ)でViewPagerを使用し、新しいフラグメントページからを表示しようとすると、このエラーが発生します。 ActivityのページからViewPagerのコンテナを参照することはできないと思います。

この場合、getActivity()を呼び出す必要があります。次に、Activityに、新しいフラグメントを開くメソッドを記述します。

_class YourActivity : AppCompatActivity() {

    fun showNewFragment(title: String) {
        val fm = supportFragmentManager
        fm?.beginTransaction()?.apply {
            val fragment = NewFragment.newInstance(title)
            replace(R.id.container, fragment, NewFragment.TAG)
            addToBackStack(null)
        }?.commit()
    }
}

class PageFragment : Fragment() {

    private fun show() {
        (activity as YourActivity).showNewFragment("New fragment")
    }
}    
_

getParentFragment()を呼び出して新しいフラグメントを追加する場合、ViewPager内に新しいフラグメントを配置します。

_class ViewPagerFragment : Fragment() {

    fun showNewFragment(title: String) {
        val fm = childFragmentManager
        fm?.beginTransaction()?.apply {
            val fragment = NewFragment.newInstance(title)
            replace(R.id.container, fragment, NewFragment.TAG)
            addToBackStack(null)
        }?.commit()
    }
}

class PageFragment : Fragment() {

    private fun show() {
        (parentFragment as? ViewPagerFragment)?.showNewFragment("New fragment")
    }
}
_
0
CoolMind