Fragment(碎片)基础详解【1】

学到Fragment,把心得写下来,可能有点乱,时常在线,可以留言

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。这张图(画的,不是官网的)说明了两者生命周期的关系:
这里写图片描述

先写一个基本应用,活动中3个button对应3个fragment,点击一个出现一个
需要分别写3个fragmeng的java文件和xml布局,布局为了区分写了一个button一个Textview一个edittext,这个简单效果图没截,在最后有效果图
步骤
1.获取到FragmentManager,在Activity中可以直接通过getFragmentManager得到。
2.开启一个事务,通过调用beginTransaction方法开启。
3.向容器内加入Fragment,一般使用replace方法实现,需要传入容器的id和Fragment的实例。
4.提交事务,调用commit方法提交。
(在这里为了兼容4.0以下的版本继承了FragmentActivity,使用getSupportFragmentManager)

public class MainActivity extends FragmentActivity implements View.OnClickListener {
private Button mBtn1;
private Button mBtn2;
private Button mBtn3;
private FrameLayout mFramcontainer;
private android.support.v4.app.FragmentTransaction mTransaction;
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager() ;    //    1
mFramcontainer= (FrameLayout) findViewById(R.id.framelayout);
mBtn1= (Button) findViewById(R.id.button1);//添加点击事件
mBtn2= (Button) findViewById(R.id.button2);
mBtn3= (Button) findViewById(R.id.button3);
mBtn1.setOnClickListener(this);
mBtn2.setOnClickListener(this);
mBtn3.setOnClickListener(this);
    }
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button1:
mTransaction=fragmentManager.beginTransaction();//     2     每次加入fragment之前必须有
mTransaction.replace(R.id.framelayout,new FragmentTest());//导入fragment到帧布局
mTransaction.commit();//提交
break;
case R.id.button2:
mTransaction=fragmentManager.beginTransaction();
mTransaction.replace(R.id.framelayout,new Fragment_sec());//replace相当于是删除一个再新建一个
mTransaction.commit();
break;
case R.id.button3:
mTransaction=fragmentManager.beginTransaction();
mTransaction.replace(R.id.framelayout,new Fragment_third());
mTransaction.commit();
break;
        }
    }
}
//布局文件:fragment是在Framelayout中的
<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"
    android:orientation="vertical">
    <FrameLayout
        android:id="@+id/framelayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></FrameLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:text="fragment1" />
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:text="fragment2" />
        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:text="fragment3" />
    </LinearLayout>
</RelativeLayout>
//下面是3个fragment的java文件,基本相同只贴一个(返回的是一个只有个button的view):
public class FragmentTest extends Fragment {
    private Button mBtn;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//复写了onCreateView方法
        View view=inflater.inflate(R.layout.fragment_test,null);//找到布局,这个布局里有个button
        mBtn= (Button) view.findViewById(R.id.frag_btn);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"点击了button",Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }
}

但是这段代码有点问题,在导入fragment的时候每次都new一个对象会刷新原来的view。
mTransaction.replace(R.id.framelayout,new Fragment_third());
我在第2个和第3个fragment的布局分别加的是edittext和textview,加入有文本在edittext里,切换fragment就会new一个新的对象这样edittext中的文本就消失了,如何解决?
把对象new在点击事件之外,然后点击切换fragment使用的是同一个对象:

private FragmentTest fragmenttest;
private Fragment_sec fragment_sec;
private Fragment_third fragment_third;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     fragmentManager = getSupportFragmentManager();
    mFramcontainer= (FrameLayout) findViewById(R.id.framelayout);
    mBtn1= (Button) findViewById(R.id.button1);
    mBtn2= (Button) findViewById(R.id.button2);
    mBtn3= (Button) findViewById(R.id.button3);
    mBtn1.setOnClickListener(this);
    mBtn2.setOnClickListener(this);
    mBtn3.setOnClickListener(this);
    fragmenttest=new FragmentTest();//实例化对象
    fragment_sec=new Fragment_sec();
    fragment_third=new Fragment_third();//其他没变只是创建对象变成了对象

然后我想把第二页edittext中的文本拿出来放到第三页的textview中:
这里出现了一个问题,使用replace文本会消失,replace会先删除原有的再新建一个,这里用的add方法

public class MainActivity extends FragmentActivity implements View.OnClickListener {
    private Button mBtn1;
    private Button mBtn2;
    private Button mBtn3;
    private FrameLayout mFramcontainer;
    private android.support.v4.app.FragmentTransaction mTransaction;
    private FragmentManager fragmentManager;
    private FragmentTest fragmenttest;
    private Fragment_sec fragment_sec;
    private Fragment_third fragment_third;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         fragmentManager = getSupportFragmentManager();
        mFramcontainer= (FrameLayout) findViewById(R.id.framelayout);
        mBtn1= (Button) findViewById(R.id.button1);
        mBtn2= (Button) findViewById(R.id.button2);
        mBtn3= (Button) findViewById(R.id.button3);
        mBtn1.setOnClickListener(this);
        mBtn2.setOnClickListener(this);
        mBtn3.setOnClickListener(this);
        fragmenttest=new FragmentTest();
        fragment_sec=new Fragment_sec();
        fragment_third=new Fragment_third();
        mTransaction=fragmentManager.beginTransaction();
        mTransaction.add(R.id.framelayout,fragmenttest);
        mTransaction.add(R.id.framelayout,fragment_sec);
        mTransaction.add(R.id.framelayout,fragment_third);
        mTransaction.hide(fragmenttest);//先把3个fragment都隐藏,不隐藏会堆叠在一起
        mTransaction.hide(fragment_sec);
        mTransaction.hide(fragment_third);
        mTransaction.commit();
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button1:
                mTransaction=fragmentManager.beginTransaction();
                mTransaction.hide(fragment_sec);//显示第一个,2、3隐藏
                mTransaction.hide(fragment_third);
                mTransaction.show(fragmenttest);
                mTransaction.commit();
                break;
            case R.id.button2:
                mTransaction=fragmentManager.beginTransaction();
                String text=fragment_sec.gettext();//调用的碎片2的java中的gettext方法得到edittext中的文本
                fragment_third.setText(text);//调用碎片3java中的settext方法,把文本写入textview
                mTransaction.hide(fragmenttest);
                mTransaction.hide(fragment_third);
                mTransaction.show(fragment_sec);
                mTransaction.commit();
                break;
            case R.id.button3:
                mTransaction=fragmentManager.beginTransaction();
                mTransaction.hide(fragmenttest);
                mTransaction.hide(fragment_sec);
                mTransaction.show(fragment_third);
                mTransaction.commit();
                break;
        }
    }
}
public String gettext(){//2中的gettext
    String s=null;
    if (mEdittext.getText()!=null){//为空返回null,不空转化成String类型
        s=mEdittext.getText().toString();
    }
    return s;
}
public void setText(String text){//3中的settext
mTextview.setText(text);
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值