1 .创建Fragment
如何创建Fragment呢?其实它与创建Activity一样要继承父类,这里不考虑向下兼容问题
在创建Fragment时最常用的就是两个父类了,Fragment 和 ListFragment,通常说起来,创建一个Fragnemt只要使用三种方法:
① OnCreate()
② OnCreateView()
③ onPause()
他们3个方法即可穿件一个Fragment。
看下面代码:
首先我们自定义出Fragnemt组件
组件类名称:TextFragment.java
package fragment; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.luo.textfragment.R; /** * Created by luolawn on 15/7/14. */ public class TextFragment extends Fragment { private Context mContext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getActivity(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = View.inflate(mContext, R.layout.fragment_text,null); return view; } @Override public void onPause() { super.onPause(); } }布局文件fragment_text.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_marginTop="50dp" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是Fragment"/> </LinearLayout>运行类MainActivity.java
package com.luo.textfragment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
运行类布局文件
<LinearLayout 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" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <fragment android:id="@+id/fragment_text" android:name="fragment.TextFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout="@layout/fragment_text" /> </LinearLayout>
运行结果
上面是静态的添加Fragment
2. 动态添加Fragment
那么如果动态的添加Fragment呢?---
小狼们都知道,Fragment是依赖Activity存在的,白痴说:就是Activity在,Fragment在,Activity亡,Fragment亡。
那么Activity如何管理Fragment呢?恩,Activity是通过事务进行管理(小狼不知道,有性趣可以问google老师)
下面是有关事务的代码
FragmentManager fm= getFragmentManager().beginTransaction();(这是在Activit类中使用的代码---)
FragmentTransaction transaction = fm.beginTransaction();(这是在Activit类中使用的代码---)
取得FragmentTransaction对象后,就可以对Fragment进行管理了
FragmentTransaction 中对frangment进行管理的方法主要是,
transaction.add(); 给Activity添加一个Fragnemt
transaction.remove(); 从Activity中移除一个Fragment,如果移除的Fragment没有加入回退站,那么这个移除的Frangment实例将会被销毁。
transaction.replace(); 使用另外一个Fragnemt实例,替换掉当前的Fragnemt实例,实际上就是remove()和add()的结合使用。
transaction.hide(); 把当前的Fragnemt影藏掉,但是并不会销毁当前影藏掉的实例.
transaction.show(); 显示之前影藏掉的fragment
在使用上面的方法时,需要注意的有(第一次使用的小狼们注意了):
在调用transcaction.add(R.id.xxx,Frangment)时, 如果Fragment在先前已经被transcation.add()添加到布局中了,那么第二次添加相同的Fragnemnt编译器将会报错,白痴说:“就是一个Fragment只能调用一次”,当然还有一种情况就是,就是在第二次调用transcation.add()前,使用transcation.remove()方法,把你上次添加的Frangment给咔擦了,让后调用transcation.add()是不会报错的,就和trascation.replace()一样永远不会报错(他是remove()和add()的组合体),但是有一个不足就是不能保存用户以前操作(解释一下,就是布局中有一个EditText控件,你在里面输入了“我是小狼”,让后切换到另一个Fragment,在切回来,你输入的“我是小狼”不会保留),transcation.remove()后fragment将会被销毁(加入回退站除外)
解决的办法是使用show()和hide(),他们仅仅是影藏,实例不会被销毁。
看下面代码,使用的是show()和hide()
framgent代码,贴出一个,其他类和布局都是一样的
fragment_text1.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_marginTop="50dp" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是Fragment1"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:text="mmm"/> </LinearLayout>
frgment类代码
public class TextFragment1 extends Fragment { private static TextFragment1 textFragment1 =null; private Context mContext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getActivity(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = View.inflate(mContext, R.layout.fragment_text1,null); return view; } @Override public void onPause() { super.onPause(); } public static Fragment getInstance(){ textFragment1 = new TextFragment1(); return textFragment1; } }
mainActivity.xml布局文件
<LinearLayout 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/fragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <RadioGroup android:id="@+id/radio_group" android:layout_width="match_parent" android:layout_height="60dp" android:orientation="horizontal" android:gravity="center_vertical" android:layout_gravity="bottom" > <RadioButton android:id="@+id/tab1" android:layout_weight="1" android:layout_width="0dp" android:layout_height="fill_parent" android:background="@null" android:button="@null" android:drawableTop="@drawable/mm_title_btn_contact_normal" android:singleLine="true" android:text="tab1" android:textSize="20sp" android:gravity="center" /> <RadioButton android:id="@+id/tab2" android:layout_weight="1" android:layout_width="0dp" android:layout_height="fill_parent" android:background="@null" android:button="@null" android:drawableTop="@drawable/tab_address_normal" android:singleLine="true" android:text="tab2" android:textSize="20sp" android:gravity="center" /> <RadioButton android:id="@+id/tab3" android:layout_weight="1" android:layout_width="0dp" android:layout_height="fill_parent" android:background="@null" android:button="@null" android:drawableTop="@drawable/tab_find_frd_normal" android:singleLine="true" android:text="tab3" android:textSize="20sp" android:gravity="center" /> <RadioButton android:id="@+id/tab4" android:layout_weight="1" android:layout_width="0dp" android:layout_height="fill_parent" android:background="@null" android:button="@null" android:drawableTop="@drawable/tab_weixin_normal" android:singleLine="true" android:text="tab4" android:textSize="20sp" android:gravity="center" /> </RadioGroup> </LinearLayout>
//mainAtivity.java
package com.luo.textfragment; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.FrameLayout; import android.widget.RadioGroup; import java.util.ArrayList; import fragment.TextFragment1; import fragment.TextFragment2; import fragment.TextFragment3; import fragment.TextFragment4; public class MainActivity extends AppCompatActivity { private ArrayList<Fragment> arrayFragment = new ArrayList<Fragment>(); private RadioGroup radioGroup ; private FrameLayout frameLayout; private int mpreFragment = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frameLayout = (FrameLayout) findViewById(R.id.fragment); radioGroup = (RadioGroup) findViewById(R.id.radio_group); radioGroup.setOnCheckedChangeListener(new RadionClickChangeListener()); initFragment(); } private void initFragment() { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); arrayFragment.add(TextFragment1.getInstance()); arrayFragment.add(TextFragment2.getInstance()); arrayFragment.add(TextFragment3.getInstance()); arrayFragment.add(TextFragment4.getInstance()); /** * 下面使用代码目的 * 为了保存用户操作,所以使用以下原理 * 1.先把布局全部添加,然后把用户暂时不看的fragment影藏起来,使用函数hide() * * 2如果用户需要看另一个fragment才让该fragment显示,使用show(),但是上一个应该不影藏气啦 * */ //把每一个tabbar对应的fragment都添加到布局中去 ft.add(R.id.fragment,arrayFragment.get(0)); ft.add(R.id.fragment,arrayFragment.get(1)); ft.add(R.id.fragment,arrayFragment.get(2)); ft.add(R.id.fragment,arrayFragment.get(3)); //把现在用户看不到的隐藏起来 ft.hide(arrayFragment.get(1)); ft.hide(arrayFragment.get(2)); ft.hide(arrayFragment.get(3)); ft.commit(); } /** * 为了查明上一个显示的是那个Fragnemtn,所以使用了一个变量进行记录 */ private class RadionClickChangeListener implements RadioGroup.OnCheckedChangeListener { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); switch (checkedId){ case R.id.tab1: // ft.add(R.id.fragment,arrayFragment.get(0)); // ft.replace(R.id.fragment,arrayFragment.get(0)); ft.hide(arrayFragment.get(mpreFragment)); ft.show(arrayFragment.get(0)); mpreFragment = 0; break; case R.id.tab2: //ft.add(R.id.fragment,arrayFragment.get(1)); // ft.replace(R.id.fragment,arrayFragment.get(1)); ft.hide(arrayFragment.get(mpreFragment)); ft.show(arrayFragment.get(1)); mpreFragment = 1; break; case R.id.tab3: // ft.add(R.id.fragment,arrayFragment.get(2)); // ft.replace(R.id.fragment,arrayFragment.get(2)); ft.hide(arrayFragment.get(mpreFragment)); ft.show(arrayFragment.get(2)); mpreFragment = 2; break; case R.id.tab4: //ft.add(R.id.fragment,arrayFragment.get(3)); // ft.replace(R.id.fragment,arrayFragment.get(3)); ft.hide(arrayFragment.get(mpreFragment)); ft.show(arrayFragment.get(3)); mpreFragment = 3; break; } ft.commit(); } } }运行效果