findViewByID ส่งคืน null


252

ก่อนอื่น: ใช่ฉันอ่านกระทู้ทั้งหมดในหัวข้อนี้ และไม่เพียง แต่จากเว็บไซต์นี้ ... (คุณเห็นฉันผิดหวังเล็กน้อย)

ส่วนใหญ่มีคำแนะนำให้ใช้android:idแทนidไฟล์ XML ฉันทำ.

จากคนอื่น ๆ ผมได้เรียนรู้ว่าการทำงานที่แตกต่างกันมากกว่าView.findViewById Activity.findViewByIdฉันจัดการสิ่งนั้นด้วย

ในตัวฉันlocation_layout.xmlฉันใช้:

<FrameLayout .... >
    <some.package.MyCustomView ... />

    <LinearLayout ... >
        <TextView ...
            android:id="@+id/txtLat" />
        ...
    </LinearLayout>
</FrameLayout>

ในกิจกรรมของฉันฉันทำ:

...
setContentView( R.layout.location_layout );

และในคลาสมุมมองที่กำหนดเองของฉัน:

... 
TextView tv = (TextView) findViewById( R.id.txtLat );

nullซึ่งผลตอบแทน การทำเช่นนี้กิจกรรมของฉันทำงานได้ดี ดังนั้นอาจจะเป็นเพราะการActivity.findViewByIdและView.findViewByIdความแตกต่าง ดังนั้นฉันจึงเก็บบริบทที่ส่งผ่านไปยังตัวสร้างมุมมองศุลกากรภายในเครื่องและลอง:

...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );

nullซึ่งก็กลับมา

จากนั้นฉันเปลี่ยนมุมมองที่กำหนดเองของฉันเพื่อขยายViewGroupแทนViewและเปลี่ยนเป็นlocation_layout.xmlปล่อยให้TextViewเป็นลูกโดยตรงของมุมมองที่กำหนดเองของฉันเพื่อให้View.findViewByIdทำงานได้ตามควร แปลกใจ: มันไม่ได้แก้อะไรเลย

แล้วฉันจะทำยังไงดี

ฉันจะขอบคุณความคิดเห็นใด ๆ


6
สิ่งนี้อาจเกิดขึ้นหากโครงการเสียหายเช่นกัน ฉันแก้ไขมันด้วยการทำความสะอาดโครงการ
Pacerier

1
ผ่านมุมมองบริบทที่ไม่ถูกต้องขอบคุณ
izzy

1
@Pierier ขอบคุณ ที่แก้ไขปัญหาของฉัน ฉันเริ่มเกลียดการเขียนโปรแกรม Android ใน Xamarin)
Artiom

@Pacerier "Clean project" แก้ไขปัญหาของฉันด้วย ดูเหมือนว่า Dropbox เสียหายโครงการ
Kohki Mametani

คำตอบ:


271

ซึ่งส่งคืน null

อาจเป็นเพราะคุณกำลังโทรหาเร็วเกินไป onFinishInflate()รอจนกระทั่ง นี่เป็นโครงการตัวอย่างที่แสดงให้เห็นถึงการViewเข้าถึงเนื้อหาแบบกำหนดเอง


67
พระเจ้าช่วย! ลาดเทเชื่อว่าฉันใช้เวลาหลายวันกับบางสิ่งที่ไม่สำคัญ ฉันย้าย setContentView () ด้านบนการโทร findViewById () และนั่นไม่ได้หลอกลวง ขอบคุณ!
agentcurry

2
@ คอมมอนส์มันเป็นโครงการที่ถูกต้องเหรอ? ฉันไม่เห็น FinishInflate ที่ใดก็ได้ในgithub.com/commonsguy/cw-advandroid/tree/master/Animation/
......

1
@likejiujitsu: มันอาจจะมีที่กลับมาในปี 2010 onFinishInflate()ฉันมีการปรับปรุงการเชื่อมโยงกับโครงการใหม่ที่มี
CommonsWare

3
ฉันมี setContentView ของฉันเรียกก่อน findViewById และมันยังคงเป็นโมฆะ ฉันกำลังอ้างถึง EditText
Neon Warge

1
ลิงก์ไปยัง GitHub ที่แก้ไขแล้วเสมอ (เช่นgithub.com/commonsguy/cw-omnibus/tree/ … ) และอย่าลบ repos หรือ rebase ;-)
Ciro Santilli 法轮功冠状病六四事件法轮功

145

อาจเป็นไปได้ว่าคุณกำลังโทรหาfindViewByIdก่อนโทรsetContentView? หากเป็นกรณีนี้ให้ลองโทรfindViewById หลังจากโทรsetContentView


1
ทีโอทีทำผิดพลาดง่าย ๆ แต่น่าเสียดายที่นี่คือสิ่งที่ฉันทำไป เครื่องมือดีบั๊กไม่ได้ใช้เพราะกล่าวว่าข้อผิดพลาดอยู่ที่บรรทัดเจตนาใหม่ของฉันไม่ได้อยู่ในกิจกรรมใหม่ที่ฉันโทร ขอบคุณ!
edude05

6
ที่จริงฉันมีข้อผิดพลาดนี้เพราะฉันเรียก setContentView ชี้ไปที่มุมมองที่ผิด ... น่าเสียดายที่ผู้รวบรวมไม่พบข้อผิดพลาดประเภทนี้
HeatfanJohn

ใช่ฉันได้ลบ setContentView โดยไม่ได้ตั้งใจและไม่เข้าใจว่าเพราะเหตุใดโปรแกรมของฉันจึงเริ่มบีบอัด
Ronen Festinger

100

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


8
ขอขอบคุณ! นั่นมัน (ในกรณีของฉันฉันมีหลายรุ่นสำหรับรุ่น Android ที่แตกต่างกัน) ฉันลืมมันตลอดเวลาแม้ว่าฉันจะใส่ความคิดเห็นขนาดใหญ่ที่ด้านบนและด้านล่างของไฟล์เลย์เอาต์ทุกไฟล์ ฉันหวังว่าคอมไพเลอร์จะทำให้เกิดข้อผิดพลาดหรือคำเตือนขนาดใหญ่หากสิ่งนี้เกิดขึ้น
tiktak

Ding Ding Ding ขอบคุณมาก! สมองของฉันงอตัวเหนือฮ่า ๆ ๆ นี้
ซัค

21

FindViewById อาจเป็นค่าว่างหากคุณเรียกใช้ตัวสร้าง super ที่ผิดในมุมมองที่กำหนดเอง แท็ก ID เป็นส่วนหนึ่งของ attrs ดังนั้นหากคุณไม่สนใจ attrs คุณจะต้องลบ ID นั้น

มันจะผิด

public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context);
}

สิ่งนี้ถูกต้อง

public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context,attrs);
}

1
ขอบคุณมากครับคุณ! ฉันไม่สนใจเลยฉันแค่สงสัยว่ามีบางอย่างผิดปกติกับ IDE ของฉัน โชคดีที่ได้พบคำตอบของคุณ
EffectiveMatrix

ฉันทำผิดพลาดเมื่อฉันสร้างมุมมองที่กำหนดเอง ขอบคุณ repkap11
Andrew F.

15

ในกรณีของฉันฉันมี 2 กิจกรรมในโครงการของฉันและmain.xml main2.xmlจากจุดเริ่มต้นmain2เป็นสำเนาของmainและทุกอย่างทำงานได้ดีจนกว่าฉันจะเพิ่มใหม่TextViewไปmain2เพื่อให้R.id.textview1กลายเป็นใช้ได้สำหรับส่วนที่เหลือของ app จากนั้นฉันพยายามดึงข้อมูลด้วยการโทรมาตรฐาน:

TextView tv = (TextView) findViewById( R.id.textview1 );

และมันก็เป็นโมฆะเสมอ มันกลับกลายเป็นว่าในคอนonCreateสตรัคเตอร์ฉันไม่ได้สร้างอินสแตนซ์main2แต่เป็นอีกอันหนึ่ง ฉันมี:

setContentView(R.layout.main);

แทน

setContentView(R.layout.main2);

ฉันสังเกตเห็นสิ่งนี้หลังจากที่ฉันมาถึงที่นี่บนเว็บไซต์


14

นอกเหนือจากสาเหตุคลาสสิกที่กล่าวถึงที่อื่น:

  • ตรวจสอบให้แน่ใจว่าคุณเคยโทรsetContentView()มาก่อนfindViewById()
  • ตรวจสอบให้แน่ใจว่าidคุณต้องการอยู่ในมุมมองหรือเค้าโครงที่คุณกำหนดsetContentView()
  • ตรวจสอบให้แน่ใจidว่าไม่ได้ตั้งใจทำซ้ำในรูปแบบที่แตกต่างกัน

มีสิ่งหนึ่งที่ฉันพบสำหรับมุมมองที่กำหนดเองในเลย์เอาต์มาตรฐานซึ่งขัดกับเอกสารประกอบ:

ในทางทฤษฎีคุณสามารถสร้างมุมมองที่กำหนดเองและเพิ่มเข้าไปในเค้าโครง ( ดูที่นี่ ) อย่างไรก็ตามฉันพบว่าในสถานการณ์เช่นนี้บางครั้งidแอ็ตทริบิวต์ใช้ได้กับมุมมองทั้งหมดในโครงร่างยกเว้นที่กำหนดเอง โซลูชันที่ฉันใช้คือ:

  1. แทนที่แต่ละมุมมองที่กำหนดเองด้วย a FrameLayoutด้วยคุณสมบัติโครงร่างเดียวกันกับที่คุณต้องการให้มุมมองที่กำหนดเอง ให้มันเหมาะสมพูดidframe_for_custom_view
  2. ในonCreate:

    setContentView(R.layout.my_layout);
    FrameView fv = findViewById(R.id.frame_for_custom_layout);
    MyCustomView cv = new MyCustomView(context);
    fv.addView(cv);

    ซึ่งทำให้มุมมองที่กำหนดเองในกรอบ


สิ่งนี้ช่วยฉันได้: "ตรวจสอบให้แน่ใจว่ารหัสที่คุณต้องการอยู่ในมุมมองหรือเค้าโครงที่คุณกำหนดให้กับ setContentView ()" จะทำอย่างไรเมื่อเป็นมุมมองย่อย พยายามรับมุมมองพาเรนต์จากนั้นทำ parentView.findById () แต่ก็ยังส่งคืนค่าว่าง
NaturalBornCamper

@naturalborncamper หากคุณโพสต์คำถามแยกต่างหากพร้อมรหัสตัวอย่างฉันจะดูมัน
Neil Townsend

ขอบคุณ Neil ฉันได้โพสต์ไปแล้วและมีคนแนะนำวิธีที่ดีกว่าในการทำสิ่งนี้ถึงแม้ว่ามันจะไม่ทำงานอย่างที่ควรจะเป็นดังนั้นฉันจึงต้องใช้กลยุทธ์ที่แตกต่าง: stackoverflow.com/questions/47955376/…
NaturalBornCamper


6

คำตอบสำหรับผู้ที่ใช้ ExpandableListView และพบกับคำถามนี้ตามชื่อของมัน

ฉันมีข้อผิดพลาดนี้พยายามที่จะทำงานกับ TextViews ในมุมมองลูกและกลุ่มของฉันเป็นส่วนหนึ่งของการใช้งาน ExpandableListView

คุณสามารถใช้สิ่งต่อไปนี้ในการใช้งานเมธอด getChildView () และ getGroupView ()

        if (convertView == null) {
            LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_layout, null);
        }

ฉันพบนี้ที่นี่


5

ฉันรักใหม่เพื่อ Android / คราสโดยไม่ได้ตั้งใจฉันเพิ่มสิ่ง UI เพื่อแทนactivity_main.xml fragment_main.xmlเอาฉันไปหลายชั่วโมงเพื่อหาว่า ...


5

FWIW ฉันไม่เห็นว่ามีใครแก้ไขได้ในลักษณะเดียวกับที่ฉันต้องการ ไม่มีการร้องเรียนเวลารวบรวม แต่ฉันได้รับมุมมองที่ว่าง ณ รันไทม์และเรียกสิ่งต่าง ๆ ในลำดับที่เหมาะสม นั่นคือ findViewById () หลังจาก setContentView () ปัญหาปรากฎว่ามุมมองของฉันถูกกำหนดใน content_main.xml แต่ใน activity_main.xml ของฉันฉันไม่มีคำสั่งนี้:

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

เมื่อฉันเพิ่มเข้าไปใน activity_main.xml จะไม่มี NullPointer อีกต่อไป


ปัญหาเกี่ยวกับการคัดลอกวางส่วนคือบางครั้งคุณลืมที่จะเปลี่ยนแปลงบางสิ่งบางอย่าง ... เป็นรูปแบบที่ถูกต้องในการขยายหนึ่งในนั้น ขอบคุณ!
Pablo Quemé

3

ฉันมีปัญหาเดียวกันนี้ ฉันใช้ไลบรารีบุคคลที่สามที่อนุญาตให้คุณแทนที่อะแดปเตอร์สำหรับ GridView และเพื่อระบุเค้าโครงของคุณเองสำหรับแต่ละเซลล์ GridView

ในที่สุดฉันก็รู้ว่าเกิดอะไรขึ้น Eclipse ยังคงใช้ไฟล์ xml เลย์เอาต์ของไลบรารีสำหรับแต่ละเซลล์ใน GridView แม้ว่าจะไม่ได้ระบุสิ่งนี้ ในอะแดปเตอร์ที่กำหนดเองของฉันมันบ่งบอกว่ามันกำลังใช้ทรัพยากร xml จากโครงการของฉันเองแม้ว่าตอนรันไทม์มันก็ไม่ได้

ดังนั้นสิ่งที่ฉันทำคือเพื่อให้แน่ใจว่าเลย์เอาต์ XML แบบกำหนดเองและรหัสของฉันแตกต่างจากที่ยังคงนั่งอยู่ในห้องสมุดทำความสะอาดโครงการแล้วเริ่มอ่านเลย์เอาต์แบบกำหนดเองที่ถูกต้องที่อยู่ในโครงการของฉัน

ในระยะสั้นโปรดระวังหากคุณกำลังเอาชนะอะแดปเตอร์ของห้องสมุดบุคคลที่สามและระบุเลย์เอาต์ XML ของคุณเองเพื่อให้อะแดปเตอร์ใช้งาน หากเลย์เอาต์ของคุณในโครงการของคุณมีชื่อไฟล์เดียวกับที่อยู่ในไลบรารีคุณอาจพบข้อผิดพลาดที่หายากจริงๆ!


3

ในกรณีของฉันโดยเฉพาะฉันพยายามเพิ่มส่วนท้ายลงใน ListView การโทรใน onCreate () ต่อไปนี้ส่งคืน null

TextView footerView = (TextView) placesListView.findViewById(R.id.footer);

การเปลี่ยนสิ่งนี้เพื่อขยายมุมมองส่วนท้ายแทนที่จะค้นหาโดยใช้ ID แก้ปัญหานี้ได้

View footerView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_view, null, false);

2

ในกรณีของฉันฉันใช้ ExpandableListView และฉันได้ตั้งค่าไว้android:transcriptMode="normal"แล้ว นี่เป็นสาเหตุให้เด็กสองสามคนในกลุ่มที่ขยายได้หายไปและฉันเคยได้รับข้อยกเว้น NULL เมื่อฉันใช้เลื่อนรายการ


2

สำหรับฉันฉันมีรูปแบบ xml สองรูปแบบสำหรับกิจกรรมเดียวกัน - รูปแบบหนึ่งในโหมดแนวตั้งและอีกรูปแบบหนึ่งในแนวนอน แน่นอนว่าฉันได้เปลี่ยนรหัสของวัตถุในภูมิประเทศ xml แต่ลืมที่จะทำการเปลี่ยนแปลงแบบเดียวกันในเวอร์ชั่นแนวตั้ง ตรวจสอบให้แน่ใจว่าคุณเปลี่ยนอย่างใดอย่างหนึ่งที่คุณทำเช่นเดียวกันกับ XML อื่น ๆ หรือคุณจะไม่ได้รับข้อผิดพลาดจนกว่าคุณจะเรียกใช้ / แก้ไขข้อบกพร่องและไม่พบรหัสที่คุณไม่ได้เปลี่ยน โอ้ความผิดพลาดโง่ทำไมคุณต้องลงโทษฉันงั้นเหรอ?


2

ตั้งค่าเนื้อหากิจกรรมจากโครงร่างทรัพยากร เช่น., setContentView(R.layout.basicXml);


2

นอกเหนือจากโซลูชันด้านบนคุณต้องแน่ใจว่า
tools:context=".TakeMultipleImages" ในโครงร่างนั้นมีค่าเดียวกันในไฟล์ mainfest.xml:
android:name=".TakeMultipleImages"สำหรับองค์ประกอบกิจกรรมเดียวกัน มันเกิดขึ้นเมื่อใช้การคัดลอกและวางเพื่อสร้างกิจกรรมใหม่


2

ฉันมีปัญหาเดียวกัน แต่ฉันคิดว่ามันควรค่าแก่การแบ่งปันกับพวกคุณ หากคุณต้อง findViewById ในรูปแบบที่กำหนดเองตัวอย่างเช่น:

public class MiniPlayerControllBar extends LinearLayout {
    //code
}

คุณไม่สามารถรับมุมมองในตัวสร้าง คุณควรเรียกใช้ findViewById หลังจากมุมมองขยายตัว พวกเขาเป็นวิธีที่คุณสามารถแทนที่onFinishInflate


2

แค่อยากจะโยนกรณีเฉพาะของฉันที่นี่ อาจช่วยคนลงบรรทัด

ฉันใช้คำสั่งใน Android UI XML ของฉันเช่นนี้:

มุมมองพาเรนต์:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="home_phone"
    android:background="@color/colorPrimary">

    ...

    <include
        layout="@layout/retry_button"
        android:visibility="gone" />

มุมมองเด็ก (retry_button):

<com.foo.RetryButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/retry"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="140dp">

.findViewById (R.id.retry) จะส่งคืนค่า null เสมอ แต่ถ้าฉันย้าย ID จากมุมมองลูกไปที่แท็กรวมมันก็เริ่มทำงาน

ผู้ปกครองคงที่:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="home_phone"
    android:background="@color/colorPrimary">

    ...

    <include
        layout="@layout/retry_button"
        android:id="@+id/retry"
        android:visibility="gone" />

เด็กคงที่:

<com.foo.RetryButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="140dp">

2

กรณีของฉันไม่เหมือนด้านบนไม่มีวิธีแก้ปัญหาทำงาน ฉันคิดว่ามุมมองของฉันลึกเกินกว่าลำดับชั้นของเค้าโครง ฉันขยับมันขึ้นไปหนึ่งระดับและมันก็ไม่ได้ว่างเปล่าอีกต่อไป


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

ลำดับชั้นของโครงร่างที่ลึกนั้นเป็นรูปแบบต่อต้านซึ่งมักจะมีโซลูชันที่สะอาดกว่าอยู่เสมอ คุณกำลังพูดถึงเมนูล้นในแถบเครื่องมือหรือลิ้นชักการนำทาง?
Deividas Strioga

ลิ้นชักการนำทางฉันโพสต์คำถามอื่นแล้วจริง ๆ แล้วยกเว้นว่าการเพิ่มรายการเมนูภายในกลุ่มไม่ทำงานเพียงเพิ่มในตอนท้ายของรายการทั้งหมด: stackoverflow.com/questions/47955376/…
NaturalBornCamper

1

ในกรณีของฉันฉันได้ขยายเลย์เอาต์ แต่มุมมองของเด็กกลับเป็นโมฆะ ตอนแรกฉันมีสิ่งนี้:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_history);

    footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
    pbSpinner = (ProgressBar) findViewById(R.id.pbListviewFooter);
    tvText = (TextView) findViewById(R.id.tvListviewFooter);
    ...
}

อย่างไรก็ตามเมื่อฉันเปลี่ยนเป็นสิ่งต่อไปนี้มันใช้งานได้:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_history);

    footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
    pbSpinner = (ProgressBar) footerView.findViewById(R.id.pbListviewFooter);
    tvText = (TextView) footerView.findViewById(R.id.tvListviewFooter);
    ...
}

กุญแจสำคัญคือการอ้างอิงรูปแบบที่สูงเกินจริงแล้วโดยเฉพาะเพื่อรับมุมมองลูก นั่นคือการเพิ่มfooterView:

  • footerView .findViewById ...

0

จากประสบการณ์ของฉันดูเหมือนว่าสิ่งนี้สามารถเกิดขึ้นได้เมื่อโค้ดของคุณถูกเรียกหลังจาก OnDestroyView (เมื่อแฟรกเมนต์อยู่ในสแต็กหลัง) หากคุณกำลังอัพเดต UI บนอินพุตจาก BroadCastReceiver คุณควรตรวจสอบว่าเป็นกรณีนี้หรือไม่ .


0

ขยายเค้าโครง !! (ซึ่งมี ID)

ในกรณีของฉัน findViewById () ส่งคืนค่า null เนื่องจากเลย์เอาต์ที่เขียนองค์ประกอบไม่ถูกขยาย ...

เช่น. fragment_layout.xml

<ListView
android:id="@+id/listview">

findViewById (R.id.listview) ส่งคืนค่า null เนื่องจากฉันไม่ได้ทำ inflater.inflate (R.layout.fragment_layout, ... , ... ); ก่อนหน้านั้น

หวังว่าคำตอบนี้จะช่วยคุณได้บ้าง



0

findViewById ยังสามารถส่งคืน null ได้หากคุณอยู่ใน Fragment ตามที่อธิบายไว้ที่นี่: findViewById ใน Fragment

คุณควรเรียกใช้ getView () เพื่อส่งคืนมุมมองระดับบนสุดภายในแฟรกเมนต์ จากนั้นคุณสามารถค้นหารายการเลย์เอาต์ (ปุ่มตัวอักษรและอื่น ๆ )


0

ฉันได้ลองทั้งหมดที่กล่าวมาแล้วข้างต้นก็ไม่ทำงาน .. ดังนั้นฉันจึงต้องทำให้ImageView ของฉันคงที่public static ImageView texture;แล้วtexture = (ImageView) findViewById(R.id.texture_back);ฉันไม่คิดว่ามันจะเป็นวิธีการที่ดี แต่วิธีนี้ใช้ได้ผลกับกรณีของฉันจริงๆ :)


ขอโทษฉันคิดว่ามุมมองคงเป็นความคิดที่ดี
vuhung3990

0

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

 Spinner hdSpinner = (Spinner)view.findViewById(R.id.accountsSpinner);

จากนั้นฉันก็ส่ง hdSpinner เป็นพารามิเตอร์ระหว่างการสร้างอแด็ปเตอร์วัตถุ

  mTransactionAdapter = new TransactionAdapter(getActivity(),
        R.layout.transactions_list_item, null, from, to, 0, hdSpinner);

0

มันล้มเหลวสำหรับฉันเพราะหนึ่งในเขตข้อมูลในรหัสกิจกรรมของฉันจับคู่กับรหัสในกิจกรรมอื่น ฉันแก้ไขโดยให้รหัสเฉพาะ

ใน id เขตข้อมูลรหัสผ่าน loginActivity.xml ของฉันคือ "รหัสผ่าน" ในกิจกรรมการลงทะเบียนของฉันฉันเพิ่งแก้ไขมันด้วยการให้ id r_password จากนั้นมันจะส่งคืนไม่ใช่วัตถุว่าง:

password = (EditText)findViewById(R.id.r_password);

0

ListViewฉันกำลังเผชิญปัญหาที่คล้ายกันเมื่อผมพยายามที่จะทำมุมมองที่กำหนดเองสำหรับ

ฉันแก้ไขมันโดยทำสิ่งนี้:

public View getView(int i, View view, ViewGroup viewGroup) {

    // Gets the inflater
    LayoutInflater inflater = LayoutInflater.from(this.contexto);

    // Inflates the layout
    ConstraintLayout cl2 = (ConstraintLayout) 
    inflater.inflate(R.layout.custom_list_view, viewGroup, false);

    //Insted of calling just findViewById, I call de cl2.findViewById method. cl2 is the layout I have just inflated. 
     TextView tv1 = (TextView)cl2.findViewById(cl2);

0

วิธีในการดีบักและค้นหาปัญหา:

  • แสดงความคิดเห็น findViewById ทั้งหมดในกิจกรรมของคุณ
  • ใส่ความคิดเห็นทุกอย่างยกเว้น onCreate และ setContentView
  • เรียกใช้โครงการและดูว่ามีการตั้งค่าเค้าโครงหรือไม่

ในกรณีของฉันฉันใช้ activity_main.xml ทั้งในโมดูลแอพของฉันและโมดูลห้องสมุดของฉัน ดังนั้นเมื่อฉันทำตามขั้นตอนข้างต้นแทนเลย์เอาต์ที่ฉันออกแบบไว้ในไลบรารีเลย์เอาต์ภายในโมดูลแอพนั้นสูงเกินจริง

ดังนั้นฉันจึงเปลี่ยนชื่อไฟล์ activity_main.xml เป็น activity_main_lib.xml

ดังนั้นให้แน่ใจว่าคุณไม่ได้มีชื่อรูปแบบที่ซ้ำกันในโครงการใด ๆ ของคุณทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.