天天看点

Activity中Framelayout做控件切换Fragment界面

目前众多App主界面采取底部导航栏与Framelayout这种方法来实现页面分割,而不是可滑动的ViewPager(感觉主要是因为所有页面都滑动会导致用户体验不佳)。

Activity中Framelayout做控件切换Fragment界面

而实现当前功能则主要有两种方法。

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);
        }
    }
}

           

然后我们修改一下页面,显得美观一些,嗯!

Activity中Framelayout做控件切换Fragment界面

啊!老夫的少女心!

然后再加点动画又如何???

如果你也需要添加动画的话请参考dgdisme的android Animation动画的xml使用

这篇文章写的十分详细。

Activity中Framelayout做控件切换Fragment界面