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