Android中Activity巢狀 Fragment的正確姿勢
阿新 • • 發佈:2019-02-02
使用 Activity + Fragment 代替直接使用 Activity ,網上這方面的講解不計其數,這不是今天我這篇博文要講的。
當今的 Android 開發模式架構,早已是 MVP 時代,不再使用 MVC 這種容易發生低耦合的架構。
我們在日常開發的時候,正確的姿勢應該是 Fragment 去實現 View 層裡面的方法,而不是直接在 Activity 裡面去實現 View 層的方法。
當然我今天的博文也不會涉及到 MVP 架構模式,就是教同學們如何正確的在 Activity 裡面巢狀 Fragment 。
程式碼示例:
Fragment
public class MainFragment extends Fragment {
/**
* Fragment 的建構函式。
*/
public MainFragment() {
}
public static MainFragment newInstance() {
return new MainFragment();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
initViews(view);
return view;
}
/**
* 初始化 Views
*
* @param view Fragment 對應的佈局控制元件。
*/
private void initViews(View view) {
// TODO: Init views.
}
}
Activity
接下來看我是如何寫 Activity 的。
佈局檔案:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" />
類檔案:
public class MainActivity extends AppCompatActivity {
private MainFragment mMainFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
mMainFragment = (MainFragment) getSupportFragmentManager()
.getFragment(savedInstanceState, "MainFragment");
} else {
mMainFragment = MainFragment.newInstance();
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.main, mMainFragment)
.commit();
}
/**
* 當活動被回收時,儲存當前的狀態。
*
* @param outState 狀態資料。
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 儲存 Fragment 的狀態。
getSupportFragmentManager().putFragment(outState, "MainFragment", mMainFragment);
}
}
這樣用正確的姿勢在 Activity 裡面巢狀 Fragment 就完成了。