目前众多App主界面采取底部导航栏与Framelayout这种方法来实现页面分割,而不是可滑动的ViewPager(感觉主要是因为所有页面都滑动会导致用户体验不佳)。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmL5EDN2MDOxQTM3ETOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
而实现当前功能则主要有两种方法。
1.replace();
2.add(),hide(),show();
相同之处:
通过FragmentManager与FragmentTransaction实现
注意:
FragmentTransaction的replace()方法实际上是add()与remove()的反复使用,删除原有的fragment并添加一个新的,导致每一次界面的切换都要重新创建一个fragment实例。(这样就产生了部分的性能损耗,虽然实现功能就好,但尽量减少性能损耗也是很重要的)
1.replace()
虽然有性能损耗,但我们依然要了解一下他的使用方法;
Fragment 这里就不展示了,随便一个正常的都可以使用;
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
FragmentManager manager;
Fragment oneFragment, twoFragmnet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化视图控件
initView();
}
private void initView() {
//获取管理
manager = getSupportFragmentManager();
//Fragment实例化
oneFragment = new OneFragment();
twoFragmnet = new TwoFragment();
//单选按钮点击事件
findViewById(R.id.bottomOne).setOnClickListener(this);
findViewById(R.id.bottomTwo).setOnClickListener(this);
//单选按钮默认选中第一个
RadioGroup mGroup = findViewById(R.id.radio);
mGroup.check(R.id.bottomOne);
//默认显示第一个界面
selectFragment(0);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bottomOne:
selectFragment(0);
break;
case R.id.bottomTwo:
selectFragment(1);
break;
}
}
private void selectFragment(int index) {
//每次切换都要获取一个新的事务
FragmentTransaction transaction = manager.beginTransaction();
switch (index) {
case 0:
transaction.replace(R.id.framelayout, oneFragment);
break;
case 1:
transaction.replace(R.id.framelayout, twoFragmnet);
break;
}
//提交事务
transaction.commit();
}
}
R.layout.activity_main
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/title"
android:gravity="center"
android:text="@string/title"
android:textColor="@color/color_FFFFFF"
android:textSize="16sp" />
<RadioGroup
android:id="@+id/radio"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="50dp"
android:background="@drawable/title"
android:orientation="horizontal">
<RadioButton
android:id="@+id/bottomOne"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/bottomone"
android:textColor="@color/color_FFFFFF" />
<RadioButton
android:id="@+id/bottomTwo"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/bottomtwo"
android:textColor="@color/color_FFFFFF" />
</RadioGroup>
<FrameLayout
android:id="@+id/framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="90dp" />
</RelativeLayout>
**
2.add(),hide(),show();
**
主要修改了fragment的处理部分
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
FragmentManager manager;
Fragment oneFragment, twoFragmnet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化视图控件
initView();
}
private void initView() {
//获取管理
manager = getSupportFragmentManager();
// //Fragment实例化
// oneFragment = new OneFragment();
// twoFragmnet = new TwoFragment();
//单选按钮点击事件
findViewById(R.id.bottomOne).setOnClickListener(this);
findViewById(R.id.bottomTwo).setOnClickListener(this);
//单选按钮默认选中第一个
RadioGroup mGroup = findViewById(R.id.radio);
mGroup.check(R.id.bottomOne);
//默认显示第一个界面
selectFragment(0);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bottomOne:
selectFragment(0);
break;
case R.id.bottomTwo:
selectFragment(1);
break;
}
}
private void selectFragment(int index) {
//开启一个Fragment事务
FragmentTransaction transaction = manager.beginTransaction();
//隐藏原先的Fragment
hideFragment(transaction);
switch (index) {
case 0:
//fragment判断是否为空
if (oneFragment == null) {
//为空则实例化
oneFragment = new OneFragment();
//添加
transaction.add(R.id.framelayout, oneFragment);
} else {
//不为空则显示
transaction.show(oneFragment);
}
break;
case 1:
if (twoFragmnet == null) {
twoFragmnet = new TwoFragment();
transaction.add(R.id.framelayout, twoFragmnet);
} else {
transaction.show(twoFragmnet);
}
break;
}
//提交事务
transaction.commit();
}
/**
* 只要fragment不为空,便一律隐藏
*/
private void hideFragment(FragmentTransaction transaction){
if (oneFragment != null) {
transaction.hide(oneFragment);
}
if (twoFragmnet != null) {
transaction.hide(twoFragmnet);
}
}
}
然后我们修改一下页面,显得美观一些,嗯!
啊!老夫的少女心!
然后再加点动画又如何???
如果你也需要添加动画的话请参考dgdisme的android Animation动画的xml使用
这篇文章写的十分详细。