代碼中 Activity 佈局只有一個 FrameLayout 容器,但 未在 XML 中聲明 Fragment,也未在動態事務中指定正確的 Fragment 類。
Fragment m_f_text_entry_activity = m_fm_text_entry_activity.findFragmentById(R.id.fragmentContainer_TextEntry);
if (m_f_text_entry_activity == null) {
m_f_text_entry_activity = new Fragment(); // 錯誤:實例化基類 Fragment,無 UI
m_fm_text_entry_activity.beginTransaction()
.add(R.id.fragmentContainer_TextEntry, m_f_text_entry_activity)
.commit();
}
activity_text_entry.xml:
<FrameLayout ...>
<fragment
android:name="com.app.journal_v001.TextEntryFragment"
android:id="@+id/fragmentContainer_TextEntry"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
Activity 只需 setContentView,Fragment 自動實例化並調用生命周期。
public class TextEntryActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_entry); // 僅含 FrameLayout 容器
if (savedInstanceState == null) { // 防止重疊
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer_TextEntry, new TextEntryFragment())
.commit();
}
}
}
public class TextEntryFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_text_entry, container, false);
}
}
new Fragment()。R.id.fragmentContainer_TextEntry)。replace 而非 add 避免重疊;判斷 savedInstanceState == null 防旋轉重建重複添加。