今天我要寫的是常見的如微信一類的底部導航與Fragment聯動的實現
1,首先,在每一個Fragment裏寫一個public權限的TAG,保證每個Fragment的TAG唯一。
2,在xml裏先好佈局:
上半部分是你要放Fragment的地方,下半部分是底部導航放置的地方。下面是我的示例代碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<FrameLayout
android:id="@+id/main_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
<RadioGroup
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/abc_ab_bottom_transparent_light_holo"
android:paddingTop="8dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/shouye_navigation"
style="@style/main_navigation"
android:text="@string/shouYe"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:checked="true"
android:drawableTop="@drawable/icon_shouye_select"
/>
<RadioButton
android:id="@+id/fenlei_navigation"
style="@style/main_navigation"
android:text="@string/fenLei"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:drawableTop="@drawable/icon_fenlei_select"
/>
<RadioButton
android:id="@+id/ruanzhuangmofa_navigation"
style="@style/main_navigation"
android:text="@string/ruanZhuangMoFa"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:drawableTop="@drawable/icon_ruanzhuangmofa_select"
/>
<RadioButton
android:id="@+id/gouwuche_navigation"
style="@style/main_navigation"
android:text="@string/gouWuChe"
android:textColor="@drawable/navigation_text_select"
android:textSize="12sp"
android:drawableTop="@drawable/icon_gouwuche_select"
/>
<RadioButton
android:id="@+id/wo_navigation"
style="@style/main_navigation"
android:text="@string/wo"
android:textColor="@drawable/navigation_text_select"
android:drawableTop="@drawable/icon_wo_select"
/>
</RadioGroup>
</LinearLayout>
3,下面是MainActivity的示例代碼:
public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
private RadioGroup controller;
//記錄顯示着的Fragment
private Fragment cacheFragment;
private FragmentManager fm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
controller = ((RadioGroup) findViewById(R.id.controller));
controller.setOnCheckedChangeListener(this);
//獲取一個FragmentManager實例
fm = getSupportFragmentManager();
//開啓一個Fragment事物
FragmentTransaction transaction = fm.beginTransaction();
//事物中進行添加操作:
//①添加的位置,ContainerViewId
// ②Fragment,我們將要添加的碎片
//③String TAG,標記,爲我們添加到Container中的Fragment添加標記.
cacheFragment = new PageOneFragment();
transaction.add(R.id.container, cacheFragment, PageOneFragment.TAG);
//提交事務
transaction.commit();
}
/**
* 當選中上網child改變的時候,就會回掉
* 不管child改變的來源,舉個例子,由外界條件改變,造成RadioGroup中的子View改變
* 一個Button,控制選中狀態改變,同樣會回掉onCheckChange的方法。
* TODO:Fragment的hide,show
* ①將顯示着的Fragment隱藏
* ②將要加載的Fragment顯示出來
*
* @param group
* @param checkedId
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.controller_one:
/*//開啓一個Fragment事物
FragmentTransaction transaction = fm.beginTransaction();
//隱藏顯示着的Fragment
if (cacheFragment!=null){
transaction.hide(cacheFragment);
}
//加載要顯示的Fragment
*//**
* ①根據TAG,去查找Fragment
* ②如果根據TAG成功找到Fragment,我們就將目標Fragment顯示出來。
* ③如果根據TAG未找到Fragment,則會返回給我們一個null,我們就需要
* 實例化一個Fragment,顯示出來,並記錄下來
*//*
cacheFragment=fm.findFragmentByTag(PageOneFragment.TAG);
if (cacheFragment!=null){
transaction.show(cacheFragment);
}else{
cacheFragment=new PageOneFragment();
transaction.add(R.id.container,cacheFragment,PageOneFragment.TAG);
}
//提交事務
transaction.commit();*/
switchPage(PageOneFragment.TAG, PageOneFragment.class);
break;
case R.id.controller_two:
switchPage(PageTwoFragment.TAG, PageTwoFragment.class);
break;
case R.id.controller_three:
switchPage(PageTreeFragment.TAG, PageTreeFragment.class);
break;
case R.id.controller_four:
switchPage(PageFourFragment.TAG, PageFourFragment.class);
break;
}
}
private void switchPage(String tag, Class<? extends Fragment> cls) {
//開啓一個Fragment事物
FragmentTransaction transactionFour = fm.beginTransaction();
//隱藏顯示着的Fragment
if (cacheFragment != null) {
transactionFour.hide(cacheFragment);
}
//加載要顯示的Fragment
/**
* ①根據TAG,去查找Fragment
* ②如果根據TAG成功找到Fragment,我們就將目標Fragment顯示出來。
* ③如果根據TAG未找到Fragment,則會返回給我們一個null,我們就需要
* 實例化一個Fragment,顯示出來,並記錄下來
*/
cacheFragment = fm.findFragmentByTag(tag);
if (cacheFragment != null) {
transactionFour.show(cacheFragment);
} else {
try {
//通過反射,使用無參構造一個Fragment實例
cacheFragment = cls.getConstructor().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
transactionFour.add(R.id.container, cacheFragment, tag);
}
//提交事務
transactionFour.commit();
}
}