Android 之fragment(静态使用)
1.Fragment介绍
Fragment可以解决App同时适应手机和平板 布局 的问题。
Fragment当成Activity的一个界面的一个组成部分,Activity的界面也可以由不同的Fragment组成,
Fragment拥有自己的生命周期和接收、处理用户的事件,于是我们就不必在Activity里面写一堆控件的事件处理的代码
更重要的是,我们可以动态的添加,替换和移除某个Fragment。
简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。
2.Fragment生命周期
可以看到Fragment比Activity多了几个额外的生命周期回调方法:
onAttach(Activity)当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)创建该Fragment的视图
onActivityCreated(Bundle)当Activity的onCreate方法返回时调用
onDestoryView()与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现。
3.Fragment的使用
静态使用Fragment,这是Fragment最简单的一种方式,把fragment当成普通的控件,直接写在Activity的布局文件中。
步骤:
1、继承Fragment,重写onCreateView决定Fragemnt的布局
2、在Activity中声明此Fragment,就当和普通的View一样
例子:(使用2个Fragment作为Activity的布局,一个Fragment用于标题布局,一个Fragment用于内容布局)
<---我们先看下效果吧--->
fragment_title的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00cef7">
<ImageView
android:id="@+id/iv_back"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/back"/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="标题"
android:textSize="20sp"
android:textStyle="bold"/>
</LinearLayout>
TitleFragment.java:
package com.ied.fragmentproject;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
/**
* Created by DELL on 2018/4/6.
*/
public class TitleFragment extends Fragment {
private ImageView ivBack;
//当创建fragment视图时调用
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
//加载片段的视图
/**
* 参数说明:
* 参数1:layout资源的ID
* 参数2:存放fragment的layout的ViewGroup
* 参数3:布尔型数据,表示是否在创建fragment的layout期间,把layout附加到container上(因为系统已把layout插入到
* container中了,所以值为false,如果为true会导致在最终的layout中创建多余的viewgroup).
*/
View view = inflater.inflate(R.layout.fragment_title,container,false);
//对视图中的控件进行初始化
ivBack = view.findViewById(R.id.iv_back);
ivBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过getActivity()获取上下文环境对象
Toast.makeText(getActivity(),"您点击了fragment_title里的ImageView按钮!!",Toast.LENGTH_SHORT).show();
}
});
return view;
}
}
同理fragment_content的布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="使用Fragment做主面板!"
android:textSize="20sp"
android:textStyle="bold"/>
</LinearLayout>
ContentFragment.java:
package com.ied.fragmentproject;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
/**
* Created by DELL on 2018/4/6.
*/
public class ContentFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_content,container,false);
return view;
}
}
MainActivity.java:
package com.ied.fragmentproject;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_info);
}
}
activity_info主界面的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<!--android:name 连接java TitleFragment里面的代码
java里面的代码连接fragment_title页面-->
<fragment
android:id="@+id/fragment_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:name="com.ied.fragmentproject.TitleFragment"/>
<fragment
android:id="@+id/fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.ied.fragmentproject.ContentFragment"
/>
</LinearLayout>
activity同fragment的通信
案例:点击activity里面的控件,修改ContentFragment里面控件的内容
步骤1:在activity的布局文件中增加控件,如下:
具体代码:
<TextView
android:id="@+id/tv_modify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击修改fragment_content里面的文本信息!"/>
步骤2:在ContentFragment中增加修改控件内容的逻辑:
具体代码:
/**
* activity和fragment通信的步骤1:自定义方法修改fragment里面的控件信息
* @param info
*/
public void modifyText(String info){
tvContent.setText(info);
}
步骤3:在activity增加修改控件内容的逻辑:
具体代码:
tvModify = (TextView) findViewById(R.id.tv_modify);
tvModify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//修改fragment_content里面的文本信息的逻辑
//getFragmentManager()获取fragment的管理器
//findFragmentById 通过id查找activity布局文件中的fragment
//activity和fragment通信的步骤2:对fragment进行初始化
ContentFragment contentFragment= (ContentFragment) getFragmentManager().findFragmentById(R.id.fragment_content);
//activity和fragment通信的步骤3:通过调用ContentFragment中的方法实现修改内容的功能。
contentFragment.modifyText("activity传递过去的内容");
}
});
效果:
密码: 4sp9
上一篇: 如何用正则表达式来表示中文
下一篇: Memcached深度分析_PHP教程
推荐阅读