Android Fragment ไม่พบมุมมองสำหรับ ID?


287

ฉันมีชิ้นส่วนที่ฉันพยายามเพิ่มเข้าไปในมุมมอง

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เป็นแฟรกเมนต์ที่ตั้งค่าเป็นโครงร่าง Fragment ใน xml
ฉันใช้ FragmentActivity feed_parser_layoutที่จะเป็นเจ้าภาพส่วนเค้าโครงถือ
ฉันกำลังเขียนโค้ดด้านบนถูกต้องหรือไม่


3
คุณสามารถรวม XML หรือไม่
jsmith

1
หนึ่งจะได้รับข้อผิดพลาดเดียวกันเมื่อมีการทำธุรกรรมส่วนก่อนที่จะเรียก setContentView ในกิจกรรม
พาเวล

คำตอบ:


374

ผมมีปัญหานี้มากเกินไปจนฉันรู้ว่าฉันได้ระบุรูปแบบที่ผิดปกติในsetContentView()ส่วนของonCreate()วิธีการ FragmentActivity

ประชาชนได้ผ่านเข้ามาFragmentTransaction.add()ในกรณีของคุณต้องเป็นเด็กของรูปแบบที่กำหนดไว้ในR.id.feedContentContainersetContentView()

คุณไม่ได้แสดงonCreate()วิธีการของคุณกับเราดังนั้นบางทีนี่อาจเป็นปัญหาเดียวกัน


5
คุณหมายถึงอะไรโดยลูกของเค้าโครงที่ระบุใน setContentView? วิธีที่จะทำให้มันเป็นเด็ก?
NinjaCoder

11
มุมมองเป็นลูกของมุมมองอื่นถ้ามีการประกาศภายในมุมมองหลักใน XML กล่าวคือ TextViewภายในเป็นเด็กที่RelativeLayout RelativeLayout
howettl

@ howettl: ฉันรู้ว่ามันเป็นโพสต์เก่า ๆ แต่ฉันไม่สามารถแก้ไขปัญหานี้ได้ด้วยคำตอบของคุณ นี่คือคำถาม SO: stackoverflow.com/questions/25844394/… - คุณช่วยฉันได้ไหม ขอบคุณ!
TheDevMan

@ howettl คุณโปรดช่วยฉันด้วยปัญหาที่คล้ายกัน stackoverflow.com/questions/26966623/…
Vamsi Challa

3
เกิดขึ้นกับฉัน. ข้อเสียของ CTRL + C CTRL + V
0nyx

297

ข้อผิดพลาดนี้ยังเกิดขึ้นเมื่อมีแฟรกเมนต์ที่ซ้อนกันและเพิ่มด้วย getSupportFragmentManager () แทน getChildFragmentManager ()


10
ฉันเป็นรอบทางอื่น พยายามเพิ่มไปยังคอนเทนเนอร์ของแฟรกเมนต์หลักด้วยการเรียกใช้ getChildFragmentManager () การชี้เรื่องนี้แก้ได้แล้วสำหรับฉัน ขอบคุณ +1
speedynomads

@Malachiasz: คุณช่วยลองดูคำถามเกี่ยวกับ ViewPager นี้ได้ไหม? ขอบคุณstackoverflow.com/questions/27937250/…
Hoa Vu

นี่คือปัญหาของฉันขอบคุณ แปลกแม้ว่าสิ่งนี้จะเกิดขึ้นในแนวนอนเท่านั้นเมื่อโทร. show () ใช้มันเพื่อแทนที่ชิ้นส่วนหลักทำงานได้ดี
cohenadair

1
นั่นคือปัญหาของฉันขอบคุณมาก! มันเกิดขึ้นเฉพาะกับอุปกรณ์ที่ช้าดังนั้นจึงยากที่จะเข้าใจว่าเกิดอะไรขึ้น
YawaraNes

1
หลังจากมาที่คำถามนี้หลายครั้งฉันรู้สึกเหมือนไม่มีใครมีปัญหาของฉันเพียงแค่ต้องเลื่อนลงเล็กน้อย มันจะดีถ้าพวกเขาได้รับรหัสข้อผิดพลาดที่เฉพาะเจาะจงมากขึ้นเพื่อบอกว่านี่อาจเป็นกรณี
KodyVanRy

67

ทางออกคือการใช้ getChildFragmentManager()

แทน getFragmentManager()

เมื่อโทรจากแฟรกเมนต์ getFragmentManager()หากคุณกำลังเรียกวิธีการจากกิจกรรมแล้วใช้

ที่จะแก้ปัญหา


4
@ surfer190 ใช้getSupportFragmentManager()แทน
Amir Hossein Ghasemi

เปลี่ยนเป็น getChildFragmentManager () และใช้งานได้ !!
Shyam

ในกรณีของฉันฉันใช้การนำทางชิ้นส่วนโดยใช้ viewpager ในแผ่นงานด้านล่าง ทางออกของคุณยอดเยี่ยม !! ตันของ Thanx ครับ
Debasish Ghosh

1
มีปัญหาเดียวกันและสิ่งนี้แก้ไขได้สำหรับฉัน! getChildFragmentManager () แทน getActivity (). getFragmentManager () ซึ่งทำให้รู้สึกเมื่อฉันคิดเกี่ยวกับมัน :) TY!
Simon

ฉันกำลังเรียกวิธีการจากกิจกรรม แต่getFragmentManager()เลิกใช้แล้วตอนนี้!
Alireza Noorali

29

ฉันมีปัญหานี้ (เมื่อสร้าง UI ของฉันในรหัส) และมันเกิดจากของฉันViewPager(ที่แสดงให้เห็นว่าFragment) ไม่มีชุดรหัสดังนั้นฉันก็ใช้pager.setID(id)แล้วมันทำงานได้

หน้านี้ช่วยฉันคิดออกว่า


1
ฉันมีปัญหาเดียวกันเมื่อใช้ viewPager ข้อผิดพลาดเดียวกันได้รับการแก้ไขโดยใช้ viewPager.setCurrentItem (n) ก่อนทำธุรกรรม บางทีมันอาจจะมีประโยชน์สำหรับใครบางคน
Kirk Hammett

ในกรณีของฉันอยู่ในทิศทางที่คล้ายกัน แต่ปัญหาคือว่าฉันใช้ค่าลบใน. setID การใช้จำนวนเต็มบวกแก้ปัญหาได้
Ignacio Hagopian

29

อีกสถานการณ์ที่ฉันได้พบ หากคุณใช้แฟรกเมนต์ที่ซ้อนกันให้พูด ViewPager ในส่วนด้วยเพจของมันก็เป็นแฟรกเมนต์ด้วยเช่นกัน

เมื่อคุณทำธุรกรรม Fragment ใน Fragment (หน้าของ ViewPager) คุณจะต้อง

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

getActivity () เป็นกุญแจสำคัญที่นี่ ...


ใช่ ... สำหรับฉันแล้วการดำเนินการอื่น ๆ ทั้งหมดก็ดีกว่านี้ ฉันได้ลองเข้าถึงรหัสเช่นนี้โดยตรง: FragmentTransaction transaction = getSupportFragmentManager (). startTransaction (); จากนั้นฉันได้ผู้จัดการแผนกโดยใช้ getActivity () แยกจากกันตามที่คุณพูดถึง มันใช้งานได้สวย
anand krish

18

ในกรณีของฉันฉันพยายามแสดง DialogFragment ที่มีเพจเจอร์และข้อยกเว้นนี้เกิดขึ้นเมื่อ FragmentPagerAdapter พยายามเพิ่ม Fragments ให้เพจเจอร์ จากคำตอบ howettl ฉันเดาว่ามันเป็นเพราะพ่อแม่ของเพจเจอร์ไม่ใช่มุมมองที่กำหนดไว้ใน setContentView () ใน FragmentActivity ของฉัน

การเปลี่ยนแปลงเพียงอย่างเดียวที่ฉันทำเพื่อแก้ไขปัญหาคือการสร้าง FragmentPagerAdapter ที่ส่งผ่านใน FragmentMager ที่ได้รับจากการเรียกใช้ getChildFragmentManager () ไม่ใช่สิ่งที่ได้รับจากการเรียกใช้ 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;
    }
}

getChildFragmentManager () ไม่สามารถเข้าถึงได้จาก DialogFragment
Abdalrahman Shatou

14

ข้อยกเว้นนี้อาจเกิดขึ้นได้หาก ID โครงร่างที่คุณส่งให้FragmentTransaction.replace(int ID, fragment)มีอยู่ในโครงร่างอื่นที่ขยายเกินจริง ตรวจสอบให้แน่ใจว่า ID โครงร่างไม่ซ้ำกันและควรใช้งานได้


คอมไพเลอร์ไม่รายงานว่า id หายไปในเลย์เอาต์ปัจจุบันหากไม่ซ้ำกันดังนั้นปัญหาจริงไม่ใช่ความเป็นเอกลักษณ์ของ id แต่เป็นการละเว้น ID ในโครงร่างปัจจุบัน
ซามูเอล

13

คำตอบที่ฉันอ่านในหัวข้ออื่นคล้ายกับกระทู้นี้ที่เหมาะกับฉันเมื่อฉันมีปัญหานี้เกี่ยวข้องกับ layout xml

logcat ของคุณระบุว่า "ไม่พบรหัส id 0x7f080011"

เปิดแล้วมองหารหัสgen->package->R.java->id0x7f080011

เมื่อฉันมีปัญหานี้รหัสนี้เป็นของFrameLayoutในactivity_main.xmlไฟล์ของฉัน

FrameLayout ไม่มี ID (ไม่มีคำสั่งandroid:id = "blablabla")

ตรวจสอบให้แน่ใจว่าส่วนประกอบทั้งหมดในโครงร่างทั้งหมดของคุณมี ID โดยเฉพาะส่วนประกอบที่อ้างถึงใน logcat


1
ดี ใน Android Studio ด้วย LinuxOS อยู่ที่นี่: / home / bob / AndroidStudioWorkspace / HelloWorld / app / build / สร้าง / source / r / release / android / support / v7 / appcompat
พอร์ตตัวอย่าง

11

ผมได้รับข้อผิดพลาดนี้เมื่อฉันปรับรุ่นจากไปcom.android.support:support-v4:21.0.0com.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> 

ดังนั้นเลย์เอาต์ต้องมีมุมมองแบบลูก ฉันสมมติว่าพวกเขาบังคับใช้สิ่งนี้ในห้องสมุดใหม่


9

ด้วยชิ้นส่วนที่ซ้อนกัน

สำหรับฉันโดยใช้getChildFragmentManager()แทนที่จะgetActivity().getSupportFragmentManager()แก้ไขข้อผิดพลาด

java.lang.IllegalArgumentException: ไม่พบมุมมองสำหรับ id


แต่ภายในอะแดปเตอร์ไม่สามารถเรียกใช้ getchildFragmentManger ทำไม
Sunil Chaudhary

8

ฉันรู้ว่าสิ่งนี้ได้รับการตอบแล้วในสถานการณ์หนึ่ง แต่ปัญหาของฉันแตกต่างกันเล็กน้อยและฉันคิดว่าฉันจะแบ่งปันในกรณีที่คนอื่นอยู่ในรองเท้าของฉัน

ฉันกำลังทำธุรกรรมภายในonCreate()แต่ ณ จุดนี้ทรีวิวไม่ได้ถูกขยายเกินจริงดังนั้นคุณจึงได้รับข้อผิดพลาดเดียวกันนี้ ใส่รหัสธุรกรรมในonResume()ทำให้ทุกอย่างทำงานได้ดี

ดังนั้นตรวจสอบให้แน่ใจว่ารหัสธุรกรรมของคุณรันหลังจากทรีวิวถูกทำให้พองเกินจริง!


3
อืม ... ในกรณีของฉันมันทำให้ไม่แตกต่างกันไม่ว่าจะเป็นรหัสดังกล่าวอยู่ใน onCreate หรือ onResume
IgorGanapolsky

@IgorGanapolsky onAttachในกรณีของฉันเกินไปแก้ไขได้ว่ามีการโทรกลับจากชิ้นส่วน ดูคำตอบ
Alexander Malakhov

นี่คือปัญหาของฉันอย่างแน่นอน การเรียกไปยังคลาสอื่นเพื่อรีเฟรชสถานะมุมมองกำลังทำธุรกรรมแฟรกเมนต์บนโครงร่างที่ยังไม่ได้ขยายเกินจริง การเรียกมันใน onResume () แก้ไขปัญหา
AWT

8

ฉันพบข้อผิดพลาดที่น่ารังเกียจเมื่อใช้ Viewpager ภายใน Recycler View ฉันพบข้อผิดพลาดด้านล่างในสถานการณ์พิเศษ ฉันเริ่มแฟรกเมนต์ที่มี RecyclerView พร้อม Viewpager (โดยใช้ FragmentStatePagerAdapter) มันทำงานได้ดีจนกระทั่งฉันเปลี่ยนไปใช้แฟรกเมนต์ที่แตกต่างกันเมื่อคลิกเซลล์ใน RecyclerView แล้วสำรวจกลับโดยใช้ปุ่มฮาร์ดแวร์ย้อนกลับของโทรศัพท์และแอพหยุดทำงาน

และสิ่งที่ตลกเกี่ยวกับเรื่องนี้ก็คือฉันมี Viewpagers สองคนใน RecyclerView เดียวกันและทั้งคู่ห่างออกไปประมาณ 5 เซลล์ (ส่วนอื่นไม่ปรากฏบนหน้าจอมันลง) ดังนั้นในตอนแรกฉันเพิ่งนำ Solution ไปใช้กับ Viewpager ตัวแรกและปล่อยอีกอันตามที่เป็นอยู่ (Viewpager ที่ใช้ Fragments)

การนำทางกลับมาทำงานได้ดีเมื่อเพจเจอร์มุมมองแรกสามารถดูได้ ตอนนี้เมื่อฉันเลื่อนลงไปที่ชิ้นที่สองจากนั้นเปลี่ยนชิ้นส่วนและกลับมามันล้มเหลว (สิ่งเดียวกันเกิดขึ้นกับชิ้นแรก) ดังนั้นฉันต้องเปลี่ยนทั้งผู้ดู

อย่างไรก็ตามอ่านด้านล่างเพื่อหาวิธีการทำงาน ข้อผิดพลาดด้านล่าง:

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

ใช้เวลาหลายชั่วโมงในการดีบั๊ก อ่านกระทู้นี้จนจบด้านล่างใช้วิธีแก้ไขปัญหาทั้งหมดรวมถึงการทำให้แน่ใจว่าฉันผ่าน childFragmentManager

ไม่มีอะไรทำงาน

ในที่สุดแทนที่จะใช้ FragmentStatePagerAdapter ฉันขยาย PagerAdapter และใช้ใน Viewpager โดยไม่ต้องใช้แฟรกเมนต์ ฉันเชื่อว่ามี BUG ที่มีชิ้นส่วนซ้อนกันอยู่ อย่างไรก็ตามเรามีตัวเลือก อ่าน ...

ลิงค์ด้านล่างมีประโยชน์มาก:

ผู้ชมที่ไม่มีแฟรกเมนต์

ลิงก์อาจตายดังนั้นฉันโพสต์โซลูชันที่นำไปใช้ของฉันที่นี่ด้านล่าง:

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

}

หวังว่านี่จะเป็นประโยชน์ !!


ใช่วิธีนี้ใช้ได้ผล แต่ถ้าฉันต้องการการก่อสร้างที่ยากด้วยวงจรชีวิตและตัวแปรของตัวเอง แต่ไม่เพียงแค่ดู มันจะใช้กับวิดีโอวิวและภาพวิวด้วยปุ่มเล่นและปิดเสียง ไม่มีอะไรที่เป็นประโยชน์สำหรับกรณีของฉัน?
Nikita Axyonov

ฉันเชื่อว่านี่คือเหตุผล: stackoverflow.com/a/27966053/1377819
Hoang Nguyen Huu

7

ฉันมีปัญหาเดียวกัน แต่ปัญหาของฉันเกิดขึ้นจากการเปลี่ยนทิศทาง ไม่มีวิธีแก้ปัญหาอื่นที่ใช้งานได้ ดังนั้นปรากฎว่าฉันลืมที่จะลบออกsetRetainInstance(true);จากชิ้นส่วนของฉันเมื่อทำรูปแบบบานหน้าต่างสองหรือหนึ่งตามขนาดหน้าจอ


เปลี่ยน false setRetainInstance ของคุณ (จริง) หากคุณอยู่ในแฟรกเมนต์ที่ซ้อนกันสิ่งนี้จะแก้ไขข้อผิดพลาด
ralphgabb

5

FragamentTransactionผิดพลาดของฉันอยู่บน

ฉันทำสิ่งนี้t.replace(R.layout.mylayout);แทนt.replace(R.id.mylayout);

ความแตกต่างคือหนึ่งคือเค้าโครงและอื่น ๆ เป็นการอ้างอิงถึง layout(id)


4

ในกรณีที่มีคนทำผิดพลาดแบบเดียวกันฉันทำ; ตรวจสอบว่าคุณไม่ได้เขียนทับเนื้อหากิจกรรมที่ใดที่หนึ่ง (เช่นค้นหาการโทรเพิ่มเติมเพื่อ setContentView)

ในกรณีของฉันเนื่องจากการคัดลอกและวางอย่างไม่ระมัดระวังฉันใช้ DataBindingUtil.setContentView ในส่วนของฉันแทนที่จะเป็น DataBindingUtil.inflate ซึ่งทำให้สถานะของกิจกรรมยุ่งเหยิง


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โปรดทราบว่าฉันได้รับการตั้งค่าเศษก่อนที่ฉัน อ๊ะ


1
ขอบคุณ! ฉันกำลังทำสิ่งเดียวกันดังนั้นฉันจึงใส่ของsetContentViewฉันonBuildHeaders
Randy

3

หน้านี้ดูเหมือนจะเป็นตำแหน่งศูนย์กลางที่ดีสำหรับการโพสต์คำแนะนำเกี่ยวกับ Fragment IllegalArgumentException นี่คืออีกหนึ่งสิ่งที่คุณสามารถลองได้ นี่คือสิ่งที่ได้ผลในที่สุดสำหรับฉัน:

ฉันลืมว่าฉันมีไฟล์เลย์เอาต์แยกต่างหากสำหรับการวางแนวนอน หลังจากที่ฉันเพิ่มคอนเทนเนอร์ FrameLayout ของฉันที่นั่นเช่นกันแฟรกเมนต์ทำงานได้


ในบันทึกย่อแยกต่างหากหากคุณได้ลองทุกอย่างที่แนะนำในหน้านี้แล้ว (และอินเทอร์เน็ตทั้งหมดด้วย) และดึงผมออกมาหลายชั่วโมงลองทิ้งเศษที่น่ารำคาญเหล่านี้แล้วกลับไปใช้เค้าโครงมาตรฐานเก่าที่ดี (นั่นคือสิ่งที่ฉันกำลังดำเนินการเมื่อฉันค้นพบปัญหาในที่สุด) คุณยังสามารถใช้แนวคิดคอนเทนเนอร์ได้ อย่างไรก็ตามแทนที่จะเติมด้วยแฟรกเมนต์คุณสามารถใช้includeแท็กxml เพื่อเติมด้วยเลย์เอาต์เดียวกันกับที่คุณจะใช้ในแฟรกเมนต์ของคุณ คุณสามารถทำสิ่งนี้ในเค้าโครงหลักของคุณ:

<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 ที่คุณพยายามใช้ในแฟรกเมนต์ของคุณ ดูการใช้เลย์เอาต์พร้อมกับการรวมสำหรับข้อมูลเพิ่มเติม


นี่เป็นข้อเสนอแนะที่ดี แต่ไม่สามารถใช้งานได้หากต้องการเปลี่ยนแฟรกเมนต์แบบไดนามิก อีกทั้งยังลดการใช้งานอีกครั้งเนื่องจากคุณสามารถห่อหุ้มพฤติกรรม (รหัส) ในส่วนได้
Alexander Malakhov

ฉันเห็นด้วยอย่างแน่นอน ชิ้นส่วนนั้นดีกว่ามาก
Suragch

2

ในกรณีของฉันฉันมี SupportMapFragment ในรายการมุมมองรีไซเคิล (ฉันใช้ liteMode "ค่าใช้จ่ายด้านล่างซึ่งทำให้แผนที่ปรากฏเป็นแบบไม่โต้ตอบเกือบเหมือนรูปภาพนิ่ง) ฉันใช้ FragmentManager ที่ถูกต้องและทุกอย่างทำงานได้ดี ... ด้วยรายการเล็ก ๆ เมื่อรายการของรายการเกินความสูงของหน้าจอเล็กน้อยฉันก็เริ่มได้รับปัญหานี้เมื่อเลื่อน

กลับกลายเป็นว่าเป็นเพราะฉันกำลังฉีด SupportMapFragment แบบไดนามิกในมุมมองซึ่งอยู่ในส่วนอื่นเพื่อแก้ไขปัญหาบางอย่างที่ฉันมีเมื่อพยายามประกาศแบบคงที่ใน XML ของฉัน ด้วยเหตุนี้เค้าโครงตัวยึดชิ้นส่วนจึงสามารถแทนที่ด้วยแฟรกเมนต์ที่แท้จริงได้เมื่อมุมมองถูกแนบกับหน้าต่างเช่นปรากฏบนหน้าจอ ดังนั้นฉันได้ใส่รหัสของฉันสำหรับการเริ่มต้น SupportMapFragment ทำ Fragment แทนที่และโทร getMapAsync () ในเหตุการณ์ onAttachedToWindow

สิ่งที่ฉันลืมทำคือตรวจสอบให้แน่ใจว่ารหัสของฉันไม่ทำงานสองครั้ง เช่นในเหตุการณ์ OnAttachedToWindow ตรวจสอบว่า SupportMapFragment แบบไดนามิกของฉันยังคงเป็นโมฆะก่อนที่จะพยายามสร้างอินสแตนซ์ใหม่ของมันและทำการแทนที่ Fragment เมื่อรายการออกไปด้านบนของ RecyclerView รายการนั้นจะถูกแยกออกจากหน้าต่างจากนั้นแนบใหม่เมื่อคุณเลื่อนกลับไปที่รายการดังนั้นเหตุการณ์นี้จะเริ่มขึ้นหลายครั้ง

เมื่อฉันเพิ่มการตรวจสอบโมฆะมันเกิดขึ้นเพียงครั้งเดียวต่อรายการ RecyclerView และปัญหาหายไป! TL; DR!


2

สิ่งนี้จะเกิดขึ้นเมื่อคุณโทรจากส่วนภายในอีกอันหนึ่ง

ใช้:

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

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. คุณสามารถใช้การดำเนินการใด ๆ ต่อมุมมองนี้ได้ในฟังก์ชั่นต่อไปนี้ในชิ้นส่วนรถจักรยานยนต์ยกตัวอย่างเช่น onActivityCreated()

หวังว่านี่จะช่วยได้!


1

ผมแก้ไขข้อบกพร่องนี้ผมใช้แทนที่commitNow()commit()

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

commitNowเป็นวิธีการซิงค์ที่commit()วิธีการเป็นวิธี async


1

ในกรณีของฉันข้อยกเว้นนี้เกิดขึ้นเมื่อฉันใช้รหัสที่แตกต่างกันสำหรับองค์ประกอบเลย์เอาต์เดียวกัน ด้วยเหตุผลบางอย่างมันทำงานได้ดีอย่างสมบูรณ์เมื่อคุณเปลี่ยนชิ้นส่วนเป็นครั้งแรก แต่ถ้าคุณพยายามทำมันอีกครั้งคุณจะได้รับข้อยกเว้นนี้ ดังนั้นให้แน่ใจว่าคุณใช้รหัสเดียวกันหากคุณมีหลายเลย์เอาต์สำหรับ Build Variants ที่แตกต่างกัน


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

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

    //...
}

0

ในกรณีของฉันฉันใช้ไฟล์คลาสแฟรกเมนต์เพื่อประกาศคลาสอะแด็ปเตอร์ listview ฉันเพิ่งใช้ไฟล์อื่นสำหรับคลาสอะแดปเตอร์สาธารณะและข้อผิดพลาดก็หายไป


0

ปัญหานี้เกิดขึ้นเมื่อคุณไม่ได้ใส่<include layout="@layout/your_fragment_layout"/>ในของคุณapp_bar_main.xml


0

มันเกิดขึ้นเช่นกันเมื่อคุณมีสองมุมมองในสองส่วนด้วยรหัสเดียวกัน


สิ่งนี้ไม่ถูกต้อง ในกรณีนี้รหัสจะไม่ได้รวบรวม
Taslim Oseni

0

ฉันมีปัญหาเดียวกันกับที่เกิดขึ้นเพราะฉันพยายามเพิ่มชิ้นส่วนก่อนที่จะเพิ่มโครงร่างคอนเทนเนอร์ลงในกิจกรรม


0

บางครั้งอาจเป็นเพราะคุณใช้ BottomNavigationView หากคุณเปิดเจตนาจากการนำทางและในกิจกรรมนั้นคุณจะเปิดส่วนย่อยให้พูด

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

กิจกรรมจะไม่สามารถค้นหาวิธีการนำทางที่คุณใช้

SOLUTION:เปลี่ยนกิจกรรมเป็นแฟรกเมนต์และจัดการการนำทางด้วย addOnBackStack ในแอปของคุณ หากคุณติดตั้งการนำทาง Jetpack เพียงใช้ชิ้นส่วนในโครงการของคุณ


0

ในกรณีของฉัน ฉันมีActivityกับเซิร์ฟเวอร์Fragmentบางครั้งฉันต้องสร้างใหม่Fragmentเมื่อ

  • ภาษาคือการเปลี่ยนแปลง
  • เค้าโครงบางส่วนต้องการบางส่วนที่ไม่ต้องการหรือการเปลี่ยนแปลงเนื้อหาจำเป็นต้องสร้างขึ้นใหม่
  • การเปลี่ยนแปลงอื่น ๆ
  • ฉันล้างทั้งหมดFragmentและตั้งค่าทั้งหมดเป็นnullกิจกรรม แต่แฟรกเมนต์สร้างตัวเองแล้วในขณะที่โฮสต์ activty คือ bean set null ดังนั้นก่อนที่จะเรียกดูแฟรกเมนต์ Fragment ตรวจสอบว่า null

    ตัวอย่างเช่น

    Activity{
        fragment
        recreate{
           fragment = null then new instance
        }
    
    }
    
    Fragment{
        if((activity).fragment != null) {
           findViewById()
        }
    
    }
    โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
    Licensed under cc by-sa 3.0 with attribution required.