4 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
該教程可能已過(guò)時(shí),嘗試創(chuàng)建基于活動(dòng)的UI,而不是向?qū)傻拇a首選的基于片段的UI。
視圖位于片段布局(fragment_main.xml
)中,而不在活動(dòng)布局(activity_main.xml
)中。onCreate()
在生命周期中太早,無(wú)法在活動(dòng)視圖層次結(jié)構(gòu)中找到它,并null
返回a。調(diào)用方法null
會(huì)導(dǎo)致NPE。
首選的解決方案是將代碼移動(dòng)到片段onCreateView()
,調(diào)用findViewById()
膨脹的片段布局rootView
:
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); View something = rootView.findViewById(R.id.something); // not activity findViewById() something.setOnClickListener(new View.OnClickListener() { ... }); return rootView;}
作為旁注,片段布局最終將成為活動(dòng)視圖層次結(jié)構(gòu)的一部分,并且可以通過(guò)活動(dòng)發(fā)現(xiàn),findViewById()
但僅在片段事務(wù)運(yùn)行之后才能發(fā)現(xiàn)。待處理的片段事務(wù)在super.onStart()
之后執(zhí)行onCreate()
。

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
嘗試OnStart()
方法,只需使用
View view = getView().findViewById(R.id.something);
或使用getView().findViewById
方法聲明任何視圖onStart()
在視圖上聲明單擊偵聽(tīng)器 anyView.setOnClickListener(this);

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
嘗試將訪(fǎng)問(wèn)視圖轉(zhuǎn)移到片段的onViewCreated方法,因?yàn)橛袝r(shí)當(dāng)您嘗試訪(fǎng)問(wèn)onCreate方法中的視圖時(shí),它們不會(huì)在此時(shí)呈現(xiàn),從而導(dǎo)致空指針異常。
@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); View something = findViewById(R.id.something); something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } }
添加回答
舉報(bào)