现在Fragment使用很广泛,最近在使用Fragment,所以有了一些认识了解。

1、首先,Fragment有v4包(android.support.v4.app.Fragment)和app包(android.app.Fragment),v4包兼容到Android 1.6 而 app 支持 Android 3.0之后的。因为3.0之后才有Fragment,为了支持之前的版本,才出了兼容性高的v4。

2、其次,在使用上其实差不多。看了以前的那些文章,基本上的区别就是:第一,v4包的Fragment所在的Activity要继承FragmentActivity;(但是我发现我从使用到现在好像没有考虑过这个点,为什么还能正常使用,GG。难道哪里不对?所以看了一下,发现原来现在Android studio 新建一个Activity时,默认继承AppCompatActivity而AppCompatActivity继承了FragmentActivity) 第二,v4包要通过getSupportFragmentManager获得FragmentManager。

3、使用方法。

FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction translaction = fm.beginTransaction();
</pre><strong></strong><p></p><p>以下参考了其他人的文章:</p>transaction.add():往Activity添加一个Fragment<p><span ><span ><span ><span >transaction.remove():</span><span >从Activity移除一个Fragment,</span><span ><span >如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁。</span></span></span></span></span></p><p><span ><span ><span ><span ><span ><span ><strong>transaction.replace()</strong></span><br  /><span >使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~</span><br  /><span ><strong>transaction.hide()</strong></span><br  /><span >隐藏当前的Fragment,仅仅是设为不可见,并不会销毁</span><br  /><span ><strong>transaction.show()</strong></span><br  /><span >显示之前隐藏的Fragment</span><br  /><span ><strong>detach()</strong></span><br  /><span >将此Fragment从Activity中分离,会销毁其布局,但不会销毁该实例</span><br  /><span ><strong>attach()</strong></span><br  /><span >将从Activity中分离的Fragment,重新关联到该Activity,重新创建其视图层次</span><br  /><span >transatcion.commit()//提交一个事务</span></span></span></span></span></span></p><p><span ><span ><span ><span ><span ><br  /><span >a、比如:在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。</span><br  /><br  /><span >b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。</span><br  /><br  /><span >c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach</span></span></span></span></span></span></p><p><span ><span ><span >4、小例子:主要是使用show和hide方法,保存界面,不至于切换到别的Fragment的时候就给销毁掉了,又得重新生成。</span></span></span></p><p><span ><span ><span >MainActivity:</span></span></span></p><p><span ><span ><span ></span></span></span><pre name="code" class="java">import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button firstBtn;
    private Button secondBtn;

    private FirstFragment firstFragment;//只是一个显示一个TextView而已
    private SecondFragment secondFragment;//可以动态添加ImageView,只是为了测试是否保存用户原来的操作
    private Fragment mTempFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        //进入app时,初始化第一个Fragment,并显示
        firstFragment = new FirstFragment();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.flayout_content,firstFragment)
                .commit();
        mTempFragment = firstFragment;
        secondFragment = new SecondFragment();
    }

    public void initView(){
        firstBtn = (Button) findViewById(R.id.btn_firstTab);
        secondBtn = (Button) findViewById(R.id.btn_secondTab);

        firstBtn.setOnClickListener(this);
        secondBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_firstTab:
                SwitchFragment(firstFragment);
                break;
            case R.id.btn_secondTab:
                SwitchFragment(secondFragment);
                break;
        }
    }

    //切换Fragment的方法
    private void SwitchFragment(Fragment fragment){
        //判断要切换的Fragment是否是当前显示的,如果不是,则要切换了
        if (fragment != mTempFragment){
            //是否已经被添加,还没有的话
            if (!fragment.isAdded()){
                //隐藏原来的Fragment,添加新的Fragment并显示
                getSupportFragmentManager().beginTransaction()
                        .hide(mTempFragment)
                        .add( R.id.flayout_content,fragment)
                        .commit();

            }else {
                getSupportFragmentManager().beginTransaction()
                        .hide(mTempFragment)
                        .show(fragment)
                        .commit();
            }

            mTempFragment = fragment;
        }
    }


}


android 使用Fragment 安卓fragment的用法_ide

android 使用Fragment 安卓fragment的用法_Android_02


两个tab之间的切换,保留了第二个tab动态添加的ImageView的状态。

Demo