Android Fragment không tìm thấy lượt xem cho ID?


287

Tôi có một đoạn tôi đang cố gắng thêm vào một khung nhìn.

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

Khi mã này được thực thi, tôi gặp lỗi sau khi gỡ lỗi ..

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

feed_parser_activitylà một mảnh được đặt thành bố cục mảnh trong xml.
Tôi đang sử dụng FragmentActivity để lưu trữ Giao diện Fragment giữ feed_parser_layout.
Tôi có mã hóa chính xác ở trên không?


3
Bạn có thể bao gồm XML không?
jsmith

1
Người ta có thể gặp lỗi tương tự khi thực hiện giao dịch phân đoạn trước khi gọi setContentView trong Activity
Pavel

Câu trả lời:


373

Tôi đã có vấn đề này quá, cho đến khi tôi nhận ra rằng tôi đã quy định cách bố trí sai trong setContentView()cáconCreate() phương pháp của FragmentActivity.

Id được truyền vào FragmentTransaction.add(), trong trường hợp của bạn R.id.feedContentContainer, phải là con của bố cục được chỉ định trongsetContentView() .

Bạn đã không chỉ cho chúng tôi onCreate()phương pháp của bạn , vì vậy có lẽ đây là vấn đề tương tự.


5
Bạn có ý nghĩa gì bởi con của bố cục được chỉ định trong setContentView? Làm thế nào để làm cho nó con?
NinjaCoder

11
Một khung nhìn là con của một khung nhìn khác nếu được khai báo bên trong khung nhìn cha trong XML. I E. một TextViewbên trong của một RelativeLayoutlà một đứa trẻ của RelativeLayout.
howettl

@howettl: Tôi biết đó là bài viết hơi cũ. Nhưng tôi không thể khắc phục vấn đề này với câu trả lời của bạn. Đây là câu hỏi SO: stackoverflow.com/questions/25844394/ Quảng cáo - Bạn có thể giúp tôi với điều này được không? Cảm ơn!
TheDevMan

@howettl, bạn có thể vui lòng giúp tôi với vấn đề tương tự. stackoverflow.com/questions/26966623/
Mạnh

3
Xảy ra với tôi. Nhược điểm của CTRL + C CTRL + V.
0nyx

295

Lỗi này cũng xảy ra khi có các Đoạn lồng nhau và thêm chúng bằng getSupportFragmentManager () thay vì getChildFragmentManager ().


10
Của tôi là cách khác. Đã cố thêm vào thùng chứa đoạn chính bằng cách gọi getChildFragmentManager (). Chỉ ra điều này đã giải quyết nó cho tôi. Cảm ơn +1
speedynomads

@Malachiasz: Bạn có thể xem câu hỏi này về ViewPager không? Cảm ơn bạn stackoverflow.com/questions/27937250/ ích
Hoa Vũ

Đây chính xác là vấn đề của tôi, cảm ơn bạn. Mặc dù, điều này chỉ xảy ra theo hướng ngang khi gọi .show (). Sử dụng nó để thay thế các mảnh chính hoạt động tốt.
cohenadair

1
Đó chính xác là vấn đề của tôi, cảm ơn bạn rất nhiều! Nó chỉ xảy ra ở một số thiết bị chậm, vì vậy thật khó để hiểu chính xác những gì đang xảy ra.
YawaraNes 10/03/2016

1
Sau khi đến câu hỏi này nhiều lần tôi cảm thấy như không có ai khác có vấn đề của mình, chỉ cần cuộn xuống một chút. Sẽ thật tuyệt nếu họ có thể lấy mã lỗi cụ thể hơn để nói rằng đây có thể là trường hợp.
KodyVanRy

67

Giải pháp là sử dụng getChildFragmentManager()

thay vì getFragmentManager()

khi gọi từ một mảnh. Nếu bạn đang gọi phương thức từ một hoạt động, sau đó sử dụng getFragmentManager().

Điều đó sẽ giải quyết vấn đề.


4
@ surfer190 sử dụng getSupportFragmentManager()thay thế.
Amir Hossein Ghasemi

Đã thay đổi thành getChildFragmentManager () và điều này hoạt động !!
Shyam

Trong trường hợp của tôi, tôi đã sử dụng điều hướng phân đoạn bằng cách sử dụng viewpager trong đoạn dưới cùng. Giải pháp của bạn đã làm việc tuyệt vời !! Tấn của Thanx bro.
Debasish Ghosh

1
có cùng một vấn đề và điều này đã giải quyết nó cho tôi! getChildFragmentManager () thay vì getActivity (). getFragmentManager () có ý nghĩa khi tôi nghĩ về nó :) TY!
Simon

Bây giờ tôi đang gọi phương thức từ một hoạt động nhưng getFragmentManager()không được chấp nhận!
Alireza Noorali

29

Tôi đã gặp vấn đề này (khi xây dựng giao diện người dùng của mình bằng mã) và nguyên nhân là do ViewPager( tôi cho thấy Fragment) không có bộ ID, vì vậy tôi chỉ đơn giản sử dụng pager.setID(id)và sau đó nó hoạt động.

Trang này đã giúp tôi tìm ra điều đó.


1
Tôi gặp vấn đề tương tự khi sử dụng viewPager. Lỗi tương tự đã được sửa bằng cách sử dụng viewPager.setCienItem (n) trước khi thực hiện giao dịch. Có lẽ nó sẽ hữu ích cho một ai đó.
Kirk Hammett

Trong trường hợp của tôi là theo hướng tương tự, nhưng vấn đề là tôi đã sử dụng giá trị âm trong .setID. Sử dụng một số nguyên dương đã giải quyết vấn đề.
Ignacio Hagopian

29

Một kịch bản khác tôi đã gặp. Nếu bạn sử dụng các đoạn được lồng vào nhau, hãy nói ViewPager trong một đoạn với các trang cũng là các đoạn.

Khi bạn thực hiện giao dịch Fragment trong đoạn bên trong (trang của ViewPager), bạn sẽ cần

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

getActivity () là chìa khóa ở đây. ...


vâng ... đối với tôi tất cả các thực hiện khác là tốt ngoài điều này. Tôi đã trực tiếp thử truy cập mã như thế này: Giao dịch FragmentTransaction = getSupportFragmentManager (). BeginTransaction (); Sau đó, tôi đã nhận được đoạn phân đoạn bằng cách sử dụng getActivity () riêng như bạn đã đề cập. Nó hoạt động khá
anand krish

18

Trong trường hợp của tôi, tôi đã cố gắng hiển thị DialogFragment có chứa máy nhắn tin và ngoại lệ này đã bị ném khi FragmentPagerAd CHƯƠNG cố gắng thêm Fragment vào máy nhắn tin. Dựa trên câu trả lời howettl Tôi đoán rằng đó là do cha mẹ Pager không phải là chế độ xem được đặt trong setContentView () trong FragmentActivity của tôi.

Sự thay đổi duy nhất tôi đã làm để giải quyết vấn đề là tạo ra FragmentPagerAd CHƯƠNG trong một FragmentMager có được bằng cách gọi getChildFragmentManager (), chứ không phải bằng cách gọi getFragmentManager () như tôi thường làm.

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

getChildFragmentManager () không thể truy cập được từ DialogFragment
Abdalrahman Shatou

14

Ngoại lệ này cũng có thể xảy ra nếu ID bố cục mà bạn chuyển qua FragmentTransaction.replace(int ID, fragment)tồn tại trong các bố cục khác đang bị thổi phồng. Đảm bảo ID bố cục là duy nhất và nó sẽ hoạt động.


Trình biên dịch không báo cáo nếu id bị thiếu trong bố cục hiện tại nếu nó không phải là duy nhất, do đó vấn đề thực sự không phải là tính duy nhất của id mà là thiếu sót của id trong bố cục hiện tại.
Samuel

13

Một câu trả lời tôi đọc trên một chủ đề khác tương tự như chủ đề này đã làm việc cho tôi khi tôi gặp vấn đề này liên quan đến bố cục xml.

Logcat của bạn nói "Không tìm thấy chế độ xem cho id 0x7f080011".

Mở ra gen->package->R.java->idvà sau đó tìm id 0x7f080011.

Khi tôi gặp vấn đề này, id này thuộc về một FrameLayouttrong activity_main.xmltập tin của tôi .

FrameLayout không có ID (không có tuyên bố android:id = "blablabla").

Đảm bảo rằng tất cả các thành phần của bạn trong tất cả các bố cục của bạn đều có ID, đặc biệt là thành phần được trích dẫn trong logcat.


1
Đẹp. Trong Android Studio, w / LinuxOS có ở đây: / home / bob / AndroidStudioWorkspace / HelloWorld / app / build / created / source / r / release / android / support / v7 / appcompat.
cổng mẫu

11

Tôi đã gặp lỗi này khi tôi nâng cấp từ com.android.support:support-v4:21.0.0lêncom.android.support:support-v4:22.1.1 .

Tôi đã phải thay đổi bố cục của mình từ đây:

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

Về điều này:

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

Vì vậy, bố cục PHẢI có một cái nhìn con. Tôi cho rằng họ đã thi hành điều này trong thư viện mới.


9

Với những mảnh vỡ lồng nhau

Đối với tôi bằng cách sử dụng getChildFragmentManager()thay vì getActivity().getSupportFragmentManager()giải quyết sự cố

java.lang.IllegalArgumentException: Không tìm thấy chế độ xem cho id


nhưng bên trong bộ chuyển đổi không thể có được getchildFragmentManger tại sao
Sunil Chaudhary

8

Tôi biết điều này đã được trả lời cho một kịch bản, nhưng vấn đề của tôi hơi khác và tôi nghĩ tôi sẽ chia sẻ trong trường hợp có ai khác ở trong đôi giày của tôi.

Tôi đã thực hiện một giao dịch bên trong onCreate(), nhưng tại thời điểm này, cây xem chưa bị thổi phồng nên bạn gặp lỗi tương tự. Đưa mã giao dịch vàoonResume() làm mọi thứ chạy tốt.

Vì vậy, chỉ cần đảm bảo mã giao dịch của bạn chạy sau khi cây xem đã bị thổi phồng!


3
Hmm ... trong trường hợp của tôi, không có sự khác biệt nào cho dù mã đó là trong onCreate hay onResume
IgorGanapolsky

@IgorGanapolsky trong trường hợp của tôi cũng vậy, đã giải quyết điều đó bằng cuộc gọi lại từ đoạn onAttach. Xem câu trả lời
Alexander Malakhov 5/03/2015

Đây là vấn đề của tôi chính xác. Một cuộc gọi đến một lớp khác để làm mới trạng thái xem đang thực hiện một giao dịch phân đoạn trên một bố cục chưa được thổi phồng. Gọi nó trong onResume () đã khắc phục sự cố.
AWT

8

Tôi đã gặp phải một lỗi khó chịu khi sử dụng Viewpager trong Recycler View. Lỗi dưới đây tôi phải đối mặt trong một tình huống đặc biệt. Tôi đã bắt đầu một đoạn có RecyclerView với Viewpager (sử dụng FragmentStatePagerAd CHƯƠNG). Nó hoạt động tốt cho đến khi tôi chuyển sang các đoạn khác nhau khi nhấp vào một ô trong RecyclerView, và sau đó điều hướng trở lại bằng nút Quay lại phần cứng của Điện thoại và Ứng dụng bị hỏng.

Và điều buồn cười về điều này là tôi đã có hai Viewpager trong cùng một RecyclerView và cả hai đều cách nhau khoảng 5 ô (cái khác không hiển thị trên màn hình, nó đã bị hỏng). Vì vậy, ban đầu tôi chỉ áp dụng Giải pháp cho Viewpager đầu tiên và để lại một cái khác như vậy (Viewpager sử dụng Fragment).

Điều hướng trở lại hoạt động tốt, khi xem máy nhắn tin đầu tiên có thể xem được. Bây giờ khi tôi cuộn xuống cái thứ hai và sau đó thay đổi mảnh vỡ và quay trở lại, nó đã bị hỏng (Điều tương tự đã xảy ra với cái đầu tiên). Vì vậy, tôi đã phải thay đổi cả Viewpager.

Dù sao, đọc dưới đây để tìm giải pháp làm việc. Lỗi tai nạn bên dưới:

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

Đã dành hàng giờ để gỡ lỗi nó. Đọc bài viết hoàn chỉnh này cho đến tận cùng áp dụng tất cả các giải pháp bao gồm đảm bảo rằng tôi đang vượt qua childFragmentManager.

Không có gì làm việc.

Cuối cùng thay vì sử dụng FragmentStatePagerAdOG, tôi đã mở rộng PagerAd CHƯƠNG và sử dụng nó trong Viewpager mà không sử dụng các đoạn. Tôi tin rằng một số nơi có BUG với các mảnh được lồng vào nhau. Dù sao, chúng tôi có các lựa chọn. Đọc ...

Liên kết dưới đây rất hữu ích:

Viewpager không có mảnh vỡ

Liên kết có thể chết vì vậy tôi đang đăng Giải pháp đã triển khai của mình ở đây bên dưới:

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

}

Hy vọng điều này là hữu ích !!


Vâng, giải pháp này đã có hiệu quả, nhưng nếu tôi cần xây dựng khó khăn với vòng đời và biến riêng, nhưng không chỉ các khung nhìn thì sao? Nó sẽ được sử dụng với videoViews và imageViews với các nút phát và tắt tiếng. Không có gì hữu ích cho trường hợp của tôi?
Nikita Axyonov


7

Tôi đã có cùng một vấn đề nhưng vấn đề của tôi đã xảy ra về thay đổi định hướng. Không có giải pháp nào khác làm việc. Vì vậy, hóa ra tôi đã quên xóa setRetainInstance(true);khỏi các mảnh vỡ của mình, khi thực hiện bố trí hai hoặc một khung dựa trên kích thước màn hình.


biến sai setRetainInstance của bạn (true) nếu bạn đang ở trong một đoạn lồng nhau, điều này sẽ sửa lỗi.
ralphgabb

5

Lỗi của tôi là FragamentTransaction .

Tôi đã làm điều này t.replace(R.layout.mylayout);thay vìt.replace(R.id.mylayout);

Sự khác biệt là một cái là bố cục và cái kia là một tham chiếu đến layout(id)


4

Chỉ trong trường hợp ai đó mắc phải sai lầm ngu ngốc tương tự tôi đã làm; kiểm tra xem bạn không ghi đè nội dung hoạt động ở đâu đó (tức là tìm kiếm các cuộc gọi bổ sung đến setContentView)

Trong trường hợp của tôi, do sao chép và dán bất cẩn, tôi đã sử dụng DataBindingUtil.setContentView trong đoạn của mình, thay vì DataBindingUtil.inflate, làm rối loạn trạng thái của hoạt động.


3

Tôi đã có vấn đề tương tự, hãy để tôi đăng mã của mình để tất cả các bạn có thể thấy nó, và không làm điều tương tự như tôi đã làm.

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

Lưu ý rằng tôi đã thiết lập các mảnh trước khi tôi setContentView. Ôi


1
Cảm ơn bạn! Tôi đã làm điều tương tự, vì vậy tôi đặt setContentViewbên trong của mìnhonBuildHeaders
Randy

3

Trang này dường như là một vị trí trung tâm tốt để đăng các đề xuất về Fragment IllegalArgumentException. Đây là một điều nữa bạn có thể thử. Đây là những gì cuối cùng đã làm việc cho tôi:

Tôi đã quên rằng tôi có một tệp bố cục riêng cho hướng ngang. Sau khi tôi thêm thùng chứa FrameLayout của mình vào đó, đoạn đó đã hoạt động.


Một lưu ý khác, nếu bạn đã thử mọi thứ khác được đề xuất trên trang này (và toàn bộ Internet) và đã nhổ tóc hàng giờ, hãy cân nhắc chỉ cần vứt bỏ những mảnh khó chịu này và quay lại bố cục tiêu chuẩn cũ. (Đó thực sự là những gì tôi đang trong quá trình thực hiện khi cuối cùng tôi phát hiện ra vấn đề của mình.) Bạn vẫn có thể sử dụng khái niệm container. Tuy nhiên, thay vì điền nó bằng một đoạn, bạn có thể sử dụng includethẻ xml để điền nó với cùng bố cục mà bạn đã sử dụng trong đoạn của mình. Bạn có thể làm một cái gì đó như thế này trong bố trí chính của bạn:

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

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

</FrameLayout>

đâu former_fragment_layoutlà tên của tệp bố cục xml mà bạn đang cố sử dụng trong đoạn của mình. Xem Tái sử dụng Bố cục kèm theo để biết thêm thông tin.


đây là một gợi ý hay, nhưng nó không hoạt động nếu người ta cần chuyển đổi các đoạn một cách linh hoạt. Ngoài ra, nó làm giảm khả năng sử dụng lại, bởi vì bạn có thể gói gọn hành vi (mã) trong đoạn.
Alexander Malakhov

Tôi chắc chắn đồng ý. Những mảnh vỡ tốt hơn nhiều.
Suragch 5/03/2015

2

Trong trường hợp của tôi, tôi đã có SupportMapFragment trong mục xem trình tái chế (Tôi đang sử dụng "liteMode" phía trên thấp hơn, làm cho bản đồ xuất hiện dưới dạng không tương tác, gần giống như hình ảnh tĩnh). Tôi đã sử dụng FragmentManager chính xác và mọi thứ dường như hoạt động tốt ... với một danh sách nhỏ. Khi danh sách các mục vượt quá chiều cao màn hình một chút thì tôi bắt đầu gặp vấn đề này khi cuộn.

Hóa ra, đó là vì tôi đã tiêm SupportMapFragment động bên trong một khung nhìn, nằm trong một đoạn khác, để giải quyết một số vấn đề tôi gặp phải khi cố gắng khai báo tĩnh trong XML của mình. Do đó, bố cục giữ chỗ mảnh chỉ có thể được thay thế bằng đoạn thực tế sau khi chế độ xem được gắn vào cửa sổ, tức là hiển thị trên màn hình. Vì vậy, tôi đã đặt mã của mình để khởi tạo SupportMapFragment, thực hiện thay thế Fragment và gọi getMapAsync () trong sự kiện onAttachedToWindow.

Điều tôi quên làm là đảm bảo rằng mã của tôi không chạy hai lần. Tức là trong sự kiện onAttachedToWindow, hãy kiểm tra xem SupportMapFragment động của tôi có còn trống không trước khi thử tạo một phiên bản mới của nó và thực hiện thay thế Fragment. Khi vật phẩm rời khỏi đỉnh RecyclerView, nó sẽ bị tách ra khỏi cửa sổ, sau đó được gắn lại khi bạn cuộn trở lại nó, vì vậy sự kiện này được kích hoạt nhiều lần.

Khi tôi đã thêm kiểm tra null, nó chỉ xảy ra một lần cho mỗi mục RecyclerView và sự cố đã biến mất! TL; DR!


2

Điều này xảy ra khi bạn đang gọi từ một mảnh bên trong một mảnh khác.

sử dụng :

getActivity().getSupportFragmentManager().beginTransaction();

1

Tôi gặp phải vấn đề này khi tôi cố gắng thay thế view bằng đoạn của mình onCreateView(). Như thế này:

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

Nó nói với tôi

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}

Sau đó, tôi đã khắc phục vấn đề này bằng cách đưa thay thế vào onActivityCreated(). Như thế này:

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. Bạn phải trả lại một khung nhìn onCreateView()để bạn có thể thay thế nó sau
  2. Bạn có thể đặt bất kỳ thao tác nào đối với chế độ xem này trong chức năng sau trong thang máy phân mảnh, như onActivityCreated()

Hi vọng điêu nay co ich!


1

Tôi đã sửa lỗi này, tôi sử dụng commitNow()thay thế commit().

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

Các commitNowlà một phương pháp đồng bộ, các commit()phương pháp là một phương pháp async.


1

Trong trường hợp của tôi, ngoại lệ này được đưa ra khi tôi sử dụng các id khác nhau cho cùng một thành phần bố cục (giữ chỗ mảnh) trong khi có một vài trong số chúng cho các Biến thể xây dựng khác nhau. Vì một số lý do, nó hoạt động hoàn toàn tốt khi bạn thay thế đoạn đầu tiên, nhưng nếu bạn cố gắng làm lại, bạn sẽ có ngoại lệ này. Vì vậy, hãy chắc chắn rằng bạn đang sử dụng cùng một id nếu bạn có nhiều bố cục cho các Biến thể xây dựng khác nhau.


0

Nếu bạn đang cố gắng thay thế một đoạn trong một đoạn bằng fragmentManagernhưng bạn không thổi phồng đoạn cha mẹ có thể gây ra vấn đề.

Trong BaseFragment.java OnCreateView :

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

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

Thay thế super.onCreateView(inflater, container, savedInstanceState); bằng cách thổi phồng bố cục chính xác cho đoạn:

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

0

Tôi đã gặp vấn đề tương tự khi thực hiện giao dịch phân đoạn trong khi tạo hoạt động.

Vấn đề cốt lõi là những gì Nick đã chỉ ra - xem cây chưa bị thổi phồng. Nhưng giải pháp của ông không hiệu quả - ngoại lệ tương tự trong onResume, onPostCreate, v.v.

Giải pháp là thêm cuộc gọi lại vào đoạn container để báo hiệu khi nó sẵn sàng:

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
}

Và sau đó trong hoạt động:

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

    //...
}

0

Trong trường hợp của tôi, tôi đã sử dụng một tệp lớp phân đoạn để khai báo một lớp bộ điều hợp listview. Tôi chỉ sử dụng một tệp khác cho lớp bộ điều hợp công cộng và lỗi đã biến mất.


0

Vấn đề này cũng xảy ra khi bạn không đặt <include layout="@layout/your_fragment_layout"/>ở của bạnapp_bar_main.xml


0

Nó cũng xảy ra khi bạn có hai chế độ xem trong hai phân đoạn có cùng id


Điều này là không đúng. Trong trường hợp này, mã thậm chí sẽ không biên dịch.
Taslim Oseni

0

Tôi gặp vấn đề tương tự do nó gây ra bởi vì tôi đã cố gắng thêm các đoạn trước khi thêm bố cục vùng chứa vào hoạt động.


0

Đôi khi, đó là vì bạn đang sử dụng bottomNavestionView. Nếu bạn mở một ý định từ điều hướng và trong hoạt động đó, bạn mở một đoạn hãy nói

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

sau đó Activity sẽ không thể tìm thấy phương thức điều hướng bạn đang sử dụng.

GIẢI PHÁP: Thay đổi hoạt động thành đoạn và xử lý điều hướng với addOnBackStack trong ứng dụng của bạn. Nếu bạn đã triển khai Điều hướng Jetpack, chỉ cần sử dụng các đoạn trong dự án của bạn.


0

Trong trường hợp của tôi. Tôi có một máy chủ Activityvới Fragmentmột số thời gian tôi cần để tạo lại Fragmentkhi

  • ngôn ngữ là sự thay đổi
  • bố cục đoạn một số cần một số không cần hoặc thay đổi nội dung cần phải tạo lại
  • những thay đổi khác
  • Tôi xóa tất cả Fragments và đặt tất cả thành nullhoạt động nhưng Fragment đã tự tạo, trong khi máy chủ kích hoạt là bean set null, vì vậy trước khi gọi Fragment view, hãy kiểm tra null

    ví dụ

    Activity{
        fragment
        recreate{
           fragment = null then new instance
        }
    
    }
    
    Fragment{
        if((activity).fragment != null) {
           findViewById()
        }
    
    }
    Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
    Licensed under cc by-sa 3.0 with attribution required.