欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragmnet 初认识

程序员文章站 2022-03-22 16:24:10
...

 

Fragment 我称这为碎片布局,你也可以想像成Activity的模块,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。

 Fragment  当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验。

 

Fragmnet 初认识

通过图片应该对Fragment 有了大概的了解。

接下来我们可以通过一些例子再来深刻的了解一下这个神奇的Fragment,注如果你使用的是3.0之前的系统,需要先导入android-support-v4.jar包。

首先在layout文件下,建立fragment1.xml,fragment2.xml 这两个布局文件。

fragment1.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" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_gravity="center"
        android:text="Fragment1" />

</LinearLayout>

fragment2.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:background="#003f3f" >
    <TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textColor="#ffffff"
    android:layout_gravity="center"
    android:text="Fragment2" />

</LinearLayout>

 

光有两个布局文件还不行,我们还要新建两个类(继承Fragment类),Fragment1.claa和Fragment2.class

注意:有继承要导入的Fragment类时,如果是使用的android3.0以下的,请导入android-support-v4包里的Fragment,如果是使用3.0以上版本的,导入:import android.app.Fragment;否则会报销。

Fragment1.class:

public class Fragment1 extends Fragment{
		//如果想要实现Fragment 提供UI,重写onCreateView().
	   @Override  
	    public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {  
	        return inflater.inflate(R.layout.fragment1, container, false);  
	    }  
	   // onCreateView();有三个参数,inflater为适配器,container为Fragment在activity中的父容器。
	   //savedInstanceState 提供了一个实例数据。
	   //inflate()方法, 第一个是resource ID,指明了当前的Fragment对应的资源文件;第二个参数是父容器控件;
	   //第三个布尔值参数表明是否连接该布局和其父容器控件,在这里的情况设置为false,因为系统已经插入了这个布局到父控件,设置为true将会产生多余的一个View Group。

}

 

Fragment2.class:

public class Fragment2 extends Fragment{
	//如果想要实现Fragment 提供UI,重写onCreateView().
   @Override  
    public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment2, container, false);  
    }  
   // onCreateView();有三个参数,inflater为适配器,container为Fragment在activity中的父容器。
   //savedInstanceState 提供了一个实例数据。
}

 

继承Fragment :回调的有三个函数,onCreate(),onCreateView(),onPuse(),

onCreata(),系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。

onCreateView(),当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。

onPuse(), 当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。

然后就是加载Fragment布局的问题:

有两种方式,一个是在Activity_layout.xml布局文件,通过<Fragment />标签加载。第二种方式是在MainActivity.java通过 程序 加载到一个指定的viewGroup中,

第一种方式:

Activity_layout.xml:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

运行得到的效果图如下:

Fragmnet 初认识

 

第二种方式:

首先得去掉Activity_layout.xml 布局中的两个<Fragment/>标签。

在Activity处于运行状态的时候,可以在Activity的布局中动态地加入Fragment,只需要指定加入这个Fragment的父View Group即可。并且为Activity_layout.xml 中LinearLayout 标签添加 一个id.

mainactivity.java:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取一个FragmentManager布局管理实例。
        FragmentManager fragmentManager = getFragmentManager();
        // 通过 布局管理实例 获取 一个fragmetnTransction 事务。beginTransaction()开启一个事务。
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        
        Fragment2 fragment = new Fragment2();
        //第一个参数R.id.mainLayout为父容器,用add()方法将fragment对象添加到 父容器。
        fragmentTransaction.add(R.id.mainLayout, fragment);
        //commit()提交事务里的内容。
        fragmentTransaction.commit();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

由空白页跑到的Fragmetn2 的布局:

Fragmnet 初认识

 

Fragment之间的通信。

 

onAttach方法:Fragment和Activity建立关联的时候调用。
onCreateView方法:为Fragment加载布局时调用。
onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
onDestroyView方法:Fragment中的布局被移除时调用。
onDetach方法:Fragment和Activity解除关联的时候调用。

 

如在Fragment 添加一个Button。

getActivity方法可以让Fragment获取到关联的Activity,然后再调用Activity的findViewById方法,就可以获取到和这个Activity关联的其它Fragment的视图了。

重写Fragment2

public class Fragment2 extends Fragment{
 //如果想要实现Fragment 提供UI,重写onCreateView().
   @Override  
    public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment2, container, false);  
    }  
   // onCreateView();有三个参数,inflater为适配器,container为Fragment在activity中的父容器。
   //savedInstanceState 提供了一个实例数据。
   @Override  
   public void onActivityCreated(Bundle savedInstanceState) {  
       super.onActivityCreated(savedInstanceState);  
       Button button = (Button) getActivity().findViewById(R.id.button1);  
       button.setOnClickListener(new OnClickListener() {  
           @Override  
           public void onClick(View v) {  
               TextView textView = (TextView) getActivity().findViewById(R.id.textView1);  
               Toast.makeText(getActivity(), textView.getText(), Toast.LENGTH_LONG).show();  
           }  
       });  
   }
}

效果图:

Fragmnet 初认识

 

 

 


 

 

转载于:https://my.oschina.net/u/1773495/blog/306739