Android Fragment tidak ditemukan view untuk ID?

287

Saya memiliki bagian yang ingin saya tambahkan ke tampilan.

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");
}

Ketika kode ini dieksekusi saya mendapatkan kesalahan berikut dalam debug ..

java.lang.IllegalArgumentException: No view found for id 0x7f080011 
   for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}

feed_parser_activityadalah Fragmen yang diatur ke tata letak Fragmen di xml.
Saya menggunakan FragmentActivity untuk menjadi tuan rumah Tata Letak Fragmen memegang feed_parser_layout.
Apakah saya mengkode ini dengan benar di atas?

coder_For_Life22
sumber
3
Bisakah Anda memasukkan XML?
jsmith
1
Seseorang bisa mendapatkan kesalahan yang sama ketika melakukan transaksi fragmen sebelum memanggil setContentView di Activity
Pavel

Jawaban:

374

Saya mengalami masalah ini juga, sampai saya menyadari bahwa saya telah ditentukan tata letak yang salah dalam setContentView()satuonCreate() metode FragmentActivity tersebut.

Id yang diteruskan FragmentTransaction.add(), dalam kasus Anda R.id.feedContentContainer, harus merupakan anak dari tata letak yang ditentukan dalamsetContentView() .

Anda tidak menunjukkan onCreate()metode Anda kepada kami , jadi mungkin ini adalah masalah yang sama.

Howettl
sumber
5
Apa yang Anda maksud dengan child layout yang ditentukan di setContentView? Bagaimana cara membuatnya menjadi anak?
NinjaCoder
11
Tampilan adalah anak dari tampilan lain jika dideklarasikan di dalam tampilan induk di XML. yaitu. bagian TextViewdalam RelativeLayoutadalah anak dari RelativeLayout.
Howettl
@ howettl: Saya tahu ini agak tua. Tetapi saya tidak dapat memperbaiki masalah ini dengan jawaban Anda. Ini pertanyaan SO: stackoverflow.com/questions/25844394/… - Bisakah Anda membantu saya dengan ini? Terima kasih!
TheDevMan
@ howettl, tolong bantu saya dengan masalah serupa. stackoverflow.com/questions/26966623/…
Vamsi Challa
3
Terjadi padaku. Kelemahan dari CTRL + C CTRL + V.
0nyx
295

Kesalahan ini juga terjadi ketika memiliki fragmen bersarang dan menambahkannya dengan getSupportFragmentManager () alih-alih getChildFragmentManager ().

Malachiasz
sumber
10
Milik saya adalah sebaliknya. Sedang berusaha menambah wadah fragmen utama dengan memanggil getChildFragmentManager (). Menunjukkan hal ini menyelesaikannya untuk saya. Terima kasih +1
speedynomads
@Malachiasz: Bisakah Anda melihat pertanyaan ini tentang ViewPager? Terima kasih stackoverflow.com/questions/27937250/…
Hoa Vu
Ini persis masalah saya, terima kasih. Anehnya, ini hanya terjadi dalam orientasi lanskap saat memanggil .show (). Menggunakannya untuk mengganti fragmen utama bekerja dengan baik.
cohenadair
1
Itulah masalah saya, terima kasih banyak! Itu terjadi hanya pada beberapa perangkat yang lambat, jadi sulit untuk memahami apa yang sebenarnya terjadi.
YawaraNes
1
Setelah datang ke pertanyaan ini beberapa kali, saya merasa tidak ada orang lain yang mengalami masalah saya, hanya perlu sedikit menggulir ke bawah. Alangkah baiknya jika mereka bisa mendapatkan kode kesalahan lebih spesifik untuk mengatakan bahwa ini bisa terjadi.
KodyVanRy
67

Solusinya adalah menggunakan getChildFragmentManager()

dari pada getFragmentManager()

saat menelepon dari sebuah fragmen. Jika Anda memanggil metode dari suatu kegiatan, maka gunakan getFragmentManager().

Itu akan menyelesaikan masalah.

Sterling Diaz
sumber
4
@ Surfer190 gunakan getSupportFragmentManager()sebagai gantinya.
Amir Hossein Ghasemi
Diubah menjadi getChildFragmentManager () dan ini berfungsi !!
Shyam
Dalam kasus saya, saya menggunakan navigasi fragmen menggunakan viewpager di fragmen lembar bawah. Solusi Anda berhasil dengan gemilang !! Ton dari Thanx bro.
Debasish Ghosh
1
punya masalah yang sama dan ini menyelesaikannya untuk saya! getChildFragmentManager () bukannya getActivity (). getFragmentManager () yang masuk akal begitu saya memikirkannya :) TY!
Simon
Saya memanggil metode dari suatu aktivitas tetapi getFragmentManager()sudah usang, sekarang!
Alireza Noorali
29

Saya punya masalah ini (ketika membangun UI saya dalam kode) dan itu disebabkan oleh saya ViewPager(yang menunjukkan Fragments) tidak memiliki set ID, jadi saya hanya menggunakan pager.setID(id)dan kemudian bekerja.

Halaman ini membantu saya mengetahui hal itu.

kaka
sumber
1
Saya memiliki masalah yang sama ketika menggunakan viewPager. Kesalahan yang sama diperbaiki dengan menggunakan viewPager.setCurrentItem (n) sebelum melakukan transaksi. Mungkin itu akan bermanfaat bagi seseorang.
Kirk Hammett
Dalam kasus saya adalah dalam arah yang sama, tetapi masalahnya adalah saya menggunakan nilai negatif dalam .setID. Menggunakan bilangan bulat positif menyelesaikan masalah.
Ignacio Hagopian
29

Skenario lain yang saya temui. Jika Anda menggunakan fragmen bersarang, katakanlah ViewPager dalam Fragmen dengan halaman itu juga Fragmen.

Ketika Anda melakukan transaksi Fragmen di fragmen dalam (halaman ViewPager), Anda akan perlu

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

getActivity () adalah kuncinya di sini. ...

zdd
sumber
ya ... bagi saya semua implementasi lain baik-baik saja selain ini. Saya langsung mencoba mengakses kode seperti ini: FragmentTransaction transaction = getSupportFragmentManager (). BeginTransaction (); Lalu saya mendapatkan fragmentmanager menggunakan getActivity () secara terpisah seperti yang Anda sebutkan. Ini bekerja dengan baik
anand krish
18

Dalam kasus saya, saya mencoba untuk menampilkan DialogFragment yang berisi pager dan pengecualian ini dilemparkan ketika FragmentPagerAdapter berusaha menambahkan Fragmen ke pager. Berdasarkan jawaban howettl saya kira itu karena orangtua Pager bukanlah tampilan yang ditetapkan di setContentView () di FragmentActivity saya.

Satu-satunya perubahan yang saya lakukan untuk menyelesaikan masalah adalah dengan membuat FragmentPagerAdapter lewat di FragmentMager yang diperoleh dengan memanggil getChildFragmentManager (), bukan yang diperoleh dengan memanggil getFragmentManager () seperti biasanya.

    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;
    }
}
garibay
sumber
getChildFragmentManager () tidak dapat diakses dari DialogFragment
Abdalrahman Shatou
14

Pengecualian ini juga dapat terjadi jika ID tata letak yang Anda lewati FragmentTransaction.replace(int ID, fragment)ada di tata letak lain yang sedang meningkat. Pastikan ID tata letak unik dan harus berfungsi.

ealihodzic
sumber
Compiler tidak melaporkan jika id hilang dalam tata letak saat ini jika tidak unik, maka masalah sebenarnya bukan keunikan id tetapi penghilangan id dalam tata letak saat ini.
Samuel
13

Sebuah jawaban yang saya baca di utas lain yang serupa dengan ini yang bekerja untuk saya ketika saya memiliki masalah ini melibatkan tata letak xml.

Logcat Anda mengatakan "Tidak ada tampilan yang ditemukan untuk id 0x7f080011".

Buka gen->package->R.java->iddan kemudian cari id0x7f080011 .

Ketika saya memiliki masalah ini, id ini milik a FrameLayoutdi sayaactivity_main.xml file .

FrameLayout tidak memiliki ID (tidak ada pernyataan android:id = "blablabla" ).

Pastikan semua komponen Anda di semua tata letak Anda memiliki ID, terutama komponen yang dikutip dalam logcat.

scottysseus
sumber
1
Bagus. Di Android Studio dengan LinuxOS ada di sini: / home / bob / AndroidStudioWorkspace / HelloWorld / app / build / generate / source / r / release / android / support / v7 / appcompat.
portsample
11

Saya mendapatkan kesalahan ini ketika saya meningkatkan dari com.android.support:support-v4:21.0.0kecom.android.support:support-v4:22.1.1 .

Saya harus mengubah tata letak dari ini:

<?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> 

Untuk ini:

<?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> 

Jadi tata letak HARUS memiliki tampilan anak. Saya berasumsi mereka menerapkan ini di perpustakaan baru.

ono
sumber
9

Dengan fragmen bersarang

Bagi saya dengan menggunakan getChildFragmentManager()bukannya getActivity().getSupportFragmentManager()crash yang diselesaikan

java.lang.IllegalArgumentException: Tidak ada tampilan yang ditemukan untuk id

UdayaLakmal
sumber
tetapi di dalam adaptor tidak bisa mendapatkan getchildFragmentManger mengapa
Sunil Chaudhary
8

Saya tahu ini sudah dijawab untuk satu skenario, tetapi masalah saya sedikit berbeda dan saya pikir saya akan berbagi kalau-kalau ada orang lain di sepatu saya.

Saya melakukan transaksi di dalam onCreate(), tetapi pada titik ini pohon tampilan belum meningkat sehingga Anda mendapatkan kesalahan yang sama. Masukkan kode transaksionResume() membuat semuanya berjalan dengan baik.

Jadi pastikan kode transaksi Anda berjalan setelah struktur tampilan meningkat!

Nick
sumber
3
Hmm ... dalam kasus saya tidak ada bedanya apakah kode tersebut ada di onCreate atau onResume
IgorGanapolsky
@IgorGanapolsky dalam kasus saya juga, menyelesaikannya dengan callback dari fragmen onAttach. Lihat jawaban
Alexander Malakhov
Inilah masalah saya sebenarnya. Panggilan ke kelas lain untuk menyegarkan keadaan tampilan sedang melakukan transaksi fragmen pada tata letak yang belum meningkat. Menyebutnya di onResume () memperbaiki masalah ini.
AWT
8

Saya menghadapi kesalahan Nasty ketika menggunakan Viewpager di dalam Recycler View. Kesalahan di bawah ini saya hadapi dalam situasi khusus. Saya memulai sebuah fragmen yang memiliki RecyclerView dengan Viewpager (menggunakan FragmentStatePagerAdapter). Ini bekerja dengan baik sampai saya beralih ke fragmen yang berbeda pada klik Sel di RecyclerView, dan kemudian menavigasi kembali menggunakan tombol Kembali perangkat keras Ponsel dan App crash.

Dan yang lucu tentang ini adalah bahwa saya memiliki dua Viewpagers dalam RecyclerView yang sama dan keduanya berjarak sekitar 5 sel (yang lain tidak terlihat di layar, itu turun). Jadi awalnya saya hanya menerapkan Solusi ke Viewpager pertama dan meninggalkan yang lain apa adanya (Viewpager menggunakan Fragmen).

Menavigasi kembali berfungsi dengan baik, ketika pager tampilan pertama dapat dilihat. Sekarang ketika saya menggulir ke bawah ke yang kedua dan kemudian mengubah fragmen dan kembali, itu hancur (Hal yang sama terjadi dengan yang pertama). Jadi saya harus mengubah kedua Viewpagers.

Bagaimanapun, baca di bawah ini untuk menemukan solusi yang berfungsi. Galat Crash di bawah ini:

java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}

Menghabiskan berjam-jam men-debug-nya. Baca posting Utas lengkap ini sampai bagian bawah menerapkan semua solusi termasuk memastikan bahwa saya melewati childFragmentManager.

Tidak ada yang berhasil.

Akhirnya alih-alih menggunakan FragmentStatePagerAdapter, saya memperluas PagerAdapter dan menggunakannya di Viewpager tanpa Menggunakan fragmen. Saya percaya beberapa di mana ada BUG dengan fragmen bersarang. Bagaimanapun, kami memiliki opsi. Baca ...

Tautan di bawah ini sangat membantu:

Viewpager Tanpa Fragmen

Tautan mungkin mati sehingga saya memposting Solusi saya yang diterapkan di sini di bawah:

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;
}

}

Semoga ini bermanfaat !!

Nilesh
sumber
Ya, solusi ini berhasil, tetapi bagaimana jika saya membutuhkan konstruksi yang sulit dengan siklus hidup dan variabel sendiri, tetapi tidak hanya pandangan? Ini akan digunakan dengan videoViews dan imageViews dengan tombol play dan mute. Tidak ada yang membantu untuk kasus saya?
Nikita Axyonov
Saya percaya inilah alasannya: stackoverflow.com/a/27966053/1377819
Hoang Nguyen Huu
7

Saya memiliki masalah yang sama tetapi masalah saya terjadi pada perubahan orientasi. Tidak ada solusi lain yang berfungsi. Jadi ternyata saya lupa menghapus setRetainInstance(true);dari fragmen saya, ketika melakukan tata letak dua atau satu panel berdasarkan ukuran layar.

VM4
sumber
mengubah false setRetainInstance Anda (benar) jika Anda berada di fragmen bersarang, ini akan memperbaiki kesalahan.
ralphgabb
5

Kesalahan saya ada di FragamentTransaction .

Saya sedang melakukan ini t.replace(R.layout.mylayout); bukant.replace(R.id.mylayout);

Perbedaannya adalah bahwa satu adalah tata letak dan yang lainnya adalah referensi ke layout(id)

mut tony
sumber
4

Untuk berjaga-jaga seandainya seseorang membuat kesalahan bodoh yang sama dengan yang saya lakukan; periksa apakah Anda tidak menimpa konten aktivitas di suatu tempat (yaitu mencari panggilan tambahan ke setContentView)

Dalam kasus saya, karena penyalinan dan tempelan yang ceroboh, saya menggunakan DataBindingUtil.setContentView dalam fragmen saya, alih-alih DataBindingUtil.inflate, yang mengacaukan keadaan aktivitas.

Squimon
sumber
3

Saya memiliki masalah yang sama, biarkan saya memposting kode saya sehingga Anda semua dapat melihatnya, dan tidak melakukan hal yang sama seperti yang saya lakukan.

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

Perhatikan bahwa saya sedang menyiapkan fragmen sebelum saya setContentView. Ups.

PearsonArtPhoto
sumber
1
Terima kasih! Saya melakukan hal yang sama, jadi saya masukkan ke setContentViewdalamonBuildHeaders
Randy
3

Halaman ini tampaknya menjadi lokasi pusat yang bagus untuk memposting saran tentang Fragment IllegalArgumentException. Inilah satu hal lagi yang bisa Anda coba. Inilah yang akhirnya berhasil untuk saya:

Saya lupa bahwa saya memiliki file tata letak terpisah untuk orientasi lanskap. Setelah saya menambahkan wadah FrameLayout saya di sana juga, fragmen bekerja.


Pada catatan terpisah, jika Anda sudah mencoba yang lain yang disarankan di halaman ini (dan seluruh internet juga) dan telah mencabut rambut Anda selama berjam-jam, pertimbangkan untuk membuang fragmen-fragmen yang menjengkelkan ini dan kembali ke tata letak standar lama yang baik. (Sebenarnya itulah yang sedang saya lakukan ketika saya akhirnya menemukan masalah saya.) Anda masih dapat menggunakan konsep wadah. Namun, alih-alih mengisinya dengan fragmen, Anda dapat menggunakan includetag xml untuk mengisinya dengan tata letak yang sama seperti yang akan Anda gunakan dalam fragmen Anda. Anda dapat melakukan sesuatu seperti ini di tata letak utama Anda:

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <include layout="@layout/former_fragment_layout" />

</FrameLayout>

di mana former_fragment_layoutnama file tata letak xml yang Anda coba gunakan dalam fragmen Anda. Lihat Menggunakan Kembali Tata Letak dengan menyertakan untuk info lebih lanjut.

Suragch
sumber
ini adalah saran yang bagus, tetapi itu tidak berfungsi jika seseorang perlu mengganti fragmen secara dinamis. Juga mengurangi kegunaan kembali, karena Anda dapat merangkum perilaku (kode) dalam fragmen.
Alexander Malakhov
Saya pasti setuju. Fragmen jauh lebih baik.
Suragch
2

Dalam kasus saya, saya memiliki SupportMapFragment dalam item tampilan pendaur ulang (saya menggunakan overhead yang lebih rendah "liteMode" yang membuat peta tampak non-interaktif, hampir seperti gambar statis). Saya menggunakan FragmentManager yang benar, dan semuanya tampak berfungsi dengan baik ... dengan daftar kecil. Setelah daftar item melebihi ketinggian layar sedikit maka saya mulai mendapatkan masalah ini saat menggulir.

Ternyata, itu karena saya menyuntikkan SupportMapFragment dinamis di dalam tampilan, yang berada di dalam fragmen lain, untuk mengatasi beberapa masalah yang saya alami ketika mencoba mendeklarasikannya secara statis di XML saya. Karena itu, tata letak placeholder fragmen hanya bisa diganti dengan fragmen yang sebenarnya setelah tampilan dilampirkan ke jendela, yaitu terlihat di layar. Jadi saya telah meletakkan kode saya untuk menginisialisasi SupportMapFragment, melakukan penggantian Fragmen, dan memanggil getMapAsync () di acara onAttachedToWindow.

Apa yang saya lupa lakukan adalah memastikan bahwa kode saya tidak berjalan dua kali. Yaitu di acara onAttachedToWindow, periksa apakah SupportMapFragment dinamis saya masih nol sebelum mencoba membuat contoh baru dan lakukan penggantian Fragment. Ketika item keluar dari bagian atas RecyclerView, itu dilepaskan dari jendela, lalu disambungkan kembali ketika Anda menggulir kembali ke sana, sehingga acara ini dipecat beberapa kali.

Setelah saya menambahkan cek nol, itu terjadi hanya sekali per item RecyclerView dan masalah hilang! TL; DR!

Breeno
sumber
2

Ini terjadi ketika Anda menelepon dari sebuah fragmen di dalam yang lain.

gunakan:

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

Saya mengalami masalah ini ketika saya mencoba mengganti tampilan dengan fragmen saya di onCreateView(). Seperti ini:

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

Itu memberitahuku

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}

Lalu saya memperbaiki masalah ini dengan meletakkan ganti onActivityCreated(). Seperti ini:

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. Anda harus mengembalikan tampilan onCreateView() sehingga Anda dapat menggantinya nanti
  2. Anda dapat menempatkan operasi apa pun terhadap tampilan ini di fungsi berikut dalam siklus pengangkatan fragmen, seperti onActivityCreated()

Semoga ini membantu!

Stephen Lin
sumber
1

Saya memperbaiki bug ini, saya menggunakan commitNow()ganti commit().

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

Ini commitNowadalah metode sinkronisasi, commit()metode ini adalah metode async.

pengguna1232595
sumber
1

Dalam kasus saya pengecualian ini dilemparkan ketika saya menggunakan id berbeda untuk elemen tata letak yang sama (fragmen placeholder) sambil memiliki beberapa dari mereka untuk Build Variants yang berbeda. Untuk beberapa alasan ini berfungsi dengan sangat baik ketika Anda mengganti fragmen untuk pertama kalinya, tetapi jika Anda mencoba melakukannya lagi Anda mendapatkan pengecualian ini. Jadi pastikan Anda menggunakan id yang sama jika Anda memiliki beberapa tata letak untuk Build Variants yang berbeda.

TK
sumber
0

Jika Anda mencoba untuk mengganti sebuah fragmen dalam sebuah fragmen dengan fragmentManagertetapi Anda tidak menggembungkan fragmen induk yang dapat menyebabkan masalah.

Di BaseFragment.java OnCreateView :

if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new DifferentFragment())
                    .commit();
        }

return super.onCreateView(inflater, container, savedInstanceState);

Ganti super.onCreateView(inflater, container, savedInstanceState); dengan menggelembungkan tata letak yang benar untuk fragmen:

        return inflater.inflate(R.layout.base_fragment, container, false);
stephen
sumber
0

Saya memiliki masalah yang sama ketika melakukan transaksi fragmen saat membuat aktivitas.

Masalah intinya adalah apa yang telah ditunjukkan oleh Nick - view tree belum meningkat. Tapi solusinya tidak bekerja - pengecualian yang sama di onResume, onPostCreate dll.

Solusinya adalah menambahkan callback ke fragmen kontainer untuk memberi sinyal ketika sudah siap:

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
}

Dan kemudian dalam aktivitas:

public class MainActivity extends Activity
        implements MyContainerFragment.Callbacks
{
    @Override
    public void onMyContainerAttached() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.containerFrame, new MyFragment())
                .commit();
    }

    //...
}
Alexander Malakhov
sumber
0

Dalam kasus saya, saya menggunakan file kelas fragmen untuk mendeklarasikan kelas adaptor listview. Saya hanya menggunakan file yang berbeda untuk kelas adaptor publik dan kesalahan sudah hilang.

Gauss
sumber
0

Masalah ini juga terjadi ketika Anda tidak menempatkan <include layout="@layout/your_fragment_layout"/>di Andaapp_bar_main.xml

Bbake Waikhom
sumber
0

Ini terjadi juga ketika Anda memiliki dua tampilan dalam dua fragmen dengan id yang sama

Hossam Hassan
sumber
Ini salah. Dalam hal ini, kode bahkan tidak dapat dikompilasi.
Taslim Oseni
0

Saya memiliki masalah yang sama karena saya mencoba menambahkan fragmen sebelum menambahkan tata letak kontainer ke aktivitas.

Rohit
sumber
0

Terkadang karena Anda menggunakan BottomNavigationView. Jika Anda membuka Intent dari navigasi dan dalam aktivitas itu Anda membuka sebuah fragmen katakanlah

transaction.replace(R.id.container,new YourFragment());

maka Kegiatan tidak akan dapat menemukan metode navigasi yang Anda gunakan.

SOLUSI: Ubah aktivitas menjadi fragmen dan kelola navigasi dengan addOnBackStack di aplikasi Anda. Jika Anda telah menerapkan Navigasi Jetpack, gunakan saja fragmen di proyek Anda.

Felipe Franco
sumber
0

Dalam kasus saya. Saya memiliki Activityserveral dengan Fragmentbeberapa waktu saya harus membuat ulang Fragmentkapan

  • bahasa berubah
  • tata letak fragmen beberapa perlu beberapa tidak perlu atau perubahan konten perlu dibuat ulang
  • perubahan lainnya
  • Saya menghapus semua Fragments dan mengatur semua ke nulldalam aktivitas tetapi Fragment sudah membuat sendiri, sementara itu aktivitas host adalah bean set null, jadi sebelum memanggil tampilan Fragment periksa null

    sebagai contoh

    Activity{
        fragment
        recreate{
           fragment = null then new instance
        }
    
    }
    
    Fragment{
        if((activity).fragment != null) {
           findViewById()
        }
    
    }
    shuabing
    sumber