fragment入门
① 创建一个类继承Fragment 重写oncreateView方法
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//inflater就是把一个xml文件打气成一个view 而且返回值本就是view
View view = inflater.inflate(R.layout.fragment_first, null);
return view;
}
}
②在布局文件中声明相应的fragment 注意 fragment节点首字母小写
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="com.itheima.fragment.FirstFragment" <!--指向要显示的fragment 要用fragment的全类名 -->
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.itheima.fragment.SecondFragment"
android:id="@+id/viewer"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
tips 获取全类名
③ 创建fragment对应的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一个fragment"/>
</RelativeLayout>
2 动态替换fragment
①创建Fragment 写一个类继承 Fragment 重写oncreateView
② 给fragment创建布局 在oncreateView 把布局转换成view对象
③在用到fragment的activity中 获得FragmentManager
④ 通过FragmentManager 开启一个FragmentTransaction
⑤通过transaction的replace方法 把fragment对象 添加到activity中的一个viewgroup里
⑥ commit提交
activity_main
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/ll_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Point outSize = new Point();
//新api 获取屏幕宽高 传入 Point 这行代码执行之后 point中就保存了 屏幕的宽高
getWindowManager().getDefaultDisplay().getSize(outSize);
int width = outSize.x;
int height = outSize.y;
//获取FragmentMananger fragment管理器
FragmentManager manager = getFragmentManager();
//通过FragmentManager 开启一个fragment的事务
FragmentTransaction transaction = manager.beginTransaction();
if(height>width){
System.out.println("竖屏");
//android.R 系统定义好的资源id
transaction.replace(R.id.ll_layout, new FstFragment());
}else{
System.out.println("横屏");
transaction.replace(R.id.ll_layout, new SecondFragment());
}
//记住一定要commit提交 否则没效果
transaction.commit();
}
android.R.id.content android系统预定义了一系列的资源id
通过android.R.id.content 实际上找到了系统创建的framelayout 这个framelayout的id 就是content
3 使用fragment创建一个选项卡页面
<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"
tools:context=".MainActivity" >
<RelativeLayout
android:id="@+id/rl_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/iv_wx"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/weixin_pressed"
/>
<ImageView
android:id="@+id/iv_contact"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/contact_list_normal"/>
<ImageView
android:id="@+id/iv_find"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/find_normal"/>
<ImageView
android:id="@+id/iv_me"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/profile_normal"/>
</LinearLayout>
</LinearLayout>
public class MainActivity extends Activity implements OnClickListener {
private ImageView iv_wx;
private ImageView iv_contact;
private ImageView iv_find;
private ImageView iv_me;
private WxFragment wxFragment;
private FindFragment findFragment;
private ContactFragment contactFragment;
private MEFragment meFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 找到底部的四个按钮
iv_wx = (ImageView) findViewById(R.id.iv_wx);
iv_contact = (ImageView) findViewById(R.id.iv_contact);
iv_find = (ImageView) findViewById(R.id.iv_find);
iv_me = (ImageView) findViewById(R.id.iv_me);
iv_contact.setOnClickListener(this);
iv_find.setOnClickListener(this);
iv_me.setOnClickListener(this);
iv_wx.setOnClickListener(this);
//用代码的方式点一下按钮
iv_wx.performClick();
}
@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;
}
@Override
public void onClick(View v) {
//把所有图片设置为初始状态
clearImage();
//获得fragmentmanager
FragmentManager manager = getFragmentManager();
//开启fragment事务
FragmentTransaction transaction = manager.beginTransaction();
switch (v.getId()) {
case R.id.iv_wx:
if(wxFragment == null){
wxFragment = new WxFragment();
}
transaction.replace(R.id.rl_layout, wxFragment);
iv_wx.setImageResource(R.drawable.weixin_pressed);
break;
case R.id.iv_contact:
if(contactFragment == null){
contactFragment = new ContactFragment();
}
transaction.replace(R.id.rl_layout, contactFragment);
iv_contact.setImageResource(R.drawable.contact_list_pressed);
break;
case R.id.iv_find:
if(findFragment==null){
findFragment = new FindFragment();
}
transaction.replace(R.id.rl_layout, findFragment);
iv_find.setImageResource(R.drawable.find_pressed);
break;
case R.id.iv_me:
if(meFragment==null){
meFragment = new MEFragment();
}
transaction.replace(R.id.rl_layout, meFragment);
iv_me.setImageResource(R.drawable.profile_pressed);
break;
}
//提交
transaction.commit();
}
//把所有的图标设置为初始状态
private void clearImage(){
iv_contact.setImageResource(R.drawable.contact_list_normal);
iv_find.setImageResource(R.drawable.find_normal);
iv_me.setImageResource(R.drawable.profile_normal);
iv_wx.setImageResource(R.drawable.weixin_normal);
}
}
4 使用fragment兼容低版本的写法
跟fragment相关的所有的代码都要导入 android.support.v4.app. 这个包下的内容
注意 获得FragmentManager区别 想用这个方法 要让当前的activity继承 FragmentActivity
import android.support.v4.app.FragmentActivity; //导包要导入support包中的fragment相关的类
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
//必须继承
public class MainActivity extends FragmentActivity {
FragmentManager fragmentManager = getSupportFragmentManager();
具体使用哪个根据项目情况
如果是老项目 没得选 只能跟别人保持一致
如果是新项目 可以选择 不用support包的 用android系统自带的fragment
注意 fragment中点击事件 不用采用第四总方式(在xml中声明onclick属性)
要用代码的方式 setonClickListener
如果非得要用onclick属性 对应的方法要写在 fragment加入到的activity中(不推荐)
5 fragment的生命周期
onCreateView 必须重写 通过这个方法加载界面 做初始化的操作
可选的
onDestory 如果fragment占用了某些资源 在onDestory 中要释放占用的资源
onstop/onPause 可以做数据保存的工作
public class FirstFragment extends Fragment {
//这个方法运行 这个fragment就跟activity建立了练习
//attach 依附 粘
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
System.out.println("onAttach");
//获得绑定的activity的引用
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("onCreate");
//创建fragment,并初始化
}
//返回一个fragmentUI
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, null);
System.out.println("onCreateView");
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
System.out.println("onActivityCreated");
//当activity和fragment都被创建以后才会调用
//当同时需要activity和fragment中的控件时,可在此方法中调用
}
@Override
public void onStart() {
super.onStart();
System.out.println("onstart");
}
@Override
public void onResume() {
super.onResume();
System.out.println("onResume");
}
@Override
public void onPause() {
super.onPause();
System.out.println("onPause");
}
@Override
public void onStop() {
super.onStop();
System.out.println("onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
System.out.println("onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
System.out.println("onDetach");
}
}
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">