Fragment初学2——使用Fragment

简介: 一般创建Fragment需要实现如下三个方法。onCreate():系统创建Fragment对象后回调该方法,实现代码中只初始化Fragment中的组件。
一般创建Fragment需要实现如下三个方法。
onCreate():系统创建Fragment对象后回调该方法,实现代码中只初始化Fragment中的组件。
onCreateView(): 当Fragment绘制界面组件时回调该方法,该方法返回的view就是该Fragment所显示的View。
onPause(): 当用户离开该Fragment时回调该方法。
好了,开始使用吧,最简单的用法—— 静态使用Fragment
步骤:
1、首先继承Fragment,重写onCreateView()方法设置Fragemnt的布局
2、在Activity中声明此Fragment,然后当做普通的View组件使用

下面一个具体例子:
TitleFragment的布局文件:

<?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="45dp"  
    android:background="@drawable/toolbar_bg"
     >  
  
    <ImageButton  
        android:id="@+id/imgBtn_title_fragment"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerVertical="true"  
        android:layout_marginLeft="3dp"  
        android:background="@drawable/imgbtn_bg" />  
  
    <TextView  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:gravity="center"  
        android:text="Fragment标题"  
        android:textColor="#fff"  
        android:textSize="20sp"  
        android:textStyle="bold" />  

</RelativeLayout>

TitleFragment.java类:

public class TitleFragment extends Fragment {
 private ImageButton mImageButton;

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_title, container, false);
  mImageButton = (ImageButton) view.findViewById(R.id.imgBtn_title_fragment);
  mImageButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    Toast.makeText(getActivity(), "这是TitleFragment! ",
      Toast.LENGTH_LONG).show();
   }
  });
  return view;
 }

}

同理FirstFragment的布局文件:

<?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"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="第一个Fragment"
        android:textSize="20sp"
        android:textStyle="bold" />
</RelativeLayout>

FirstFragment .java类:

public class FirstFragment extends Fragment {

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  return inflater.inflate(R.layout.fragment_first, container, false);
 }
}

MainActivity布局如下:
<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" >

    <fragment
        android:id="@+id/fragment_title_main"
        android:name="com.example.activity.TitleFragment"
        android:layout_width="match_parent"
        android:layout_height="45dp" />

    <fragment
        android:id="@+id/fragment_first_main"
        android:name="com.example.activity.FirstFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/fragment_title_main" />

</RelativeLayout>

MainActivity.java类

public class MainActivity extends Activity {
 @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        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;
 }
}

说完了静态使用Fragment,下面再说下如何动态使用吧
首先修改下 MainActivity的布局文件

<?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" >

    <fragment
        android:id="@+id/fragment_title_main"
        android:name="com.example.activity.TitleFragment"
        android:layout_width="match_parent"
        android:layout_height="45dp" />

    <FrameLayout
        android:id="@+id/framelayout_fragment_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/linearlayout_toolbar_main"
        android:layout_below="@+id/fragment_title_main" />

    <LinearLayout
        android:id="@+id/linearlayout_toolbar_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="@drawable/toolbar_bg" >

        <TextView
            android:id="@+id/textView1_main"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="第一个"
            android:textColor="#fff"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/textView2_main"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="第二个"
            android:textColor="#fff"
            android:textSize="20sp" />
    </LinearLayout>

</RelativeLayout>

需要使用FragmentManager对Fragment进行动态的加载,这里使用的是replace方法,下一节再详细介绍FragmentManager的常用API。

我们第一节说过Fragment是Android3.0引入的API,所以如果使用以前的版本,需要引入v4的包,然后Activity继承FragmentActivity,然后通过 getSupportFragmentManager获得FragmentManager。所以还是建议把Manifest文件的uses-sdk的 minSdkVersion和targetSdkVersion都改为11以上,这样就不必引入v4包了。


MainActivity.java类

public class MainActivity extends Activity implements OnClickListener {

 private Fragment mFirst, mTwo;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  // WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.activity_main);

  TextView First = (TextView) findViewById(R.id.textView1_main);
  TextView Two = (TextView) findViewById(R.id.textView2_main);

  First.setOnClickListener(this);
  Two.setOnClickListener(this);
  // 设置默认的Fragment
  setDefaultFragment();
 }

 private void setDefaultFragment() {
  FragmentManager fm = getFragmentManager();
  FragmentTransaction transaction = fm.beginTransaction();
  mFirst = new FirstFragment();
  transaction.replace(R.id.framelayout_fragment_main, mFirst);
  transaction.commit();
 }

 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  FragmentManager fm = getFragmentManager();
  // 开启Fragment事务
  FragmentTransaction transaction = fm.beginTransaction();

  switch (v.getId()) {
  case R.id.textView1_main:
   if (mFirst == null) {
    mFirst = new FirstFragment();
   }
   // 使用当前Fragment的布局替代id_content的控件
   transaction.replace(R.id.framelayout_fragment_main, mFirst);
   break;
  case R.id.textView2_main:
   if (mTwo == null) {
    mTwo = new TwoFragment();
   }
   transaction.replace(R.id.framelayout_fragment_main, mTwo);
   break;
  }
  // transaction.addToBackStack();
  // 事务提交
  transaction.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;
 }

}

代码中的TwoFragment和FirstFragment类似,就不粘代码了,我会上传源代码
源代码
相关文章
|
9月前
|
XML 缓存 Android开发
QMUI实战(二)—Activity 和 Fragment,我们该选择谁?
在一开始,官方只提供了 Activity 来作为 UI 界面的载体,因此我们也别无选择,只能用它。而在 Android 3.0 后,Fragment 也面世了,它一开始是用于适配平板的,以邮件列表与详情的适配为例,手机端够小,因此开始展示列表,点击进入详情,而平板够大,则可以列表显示在左侧,详情显示在右侧,点击列表只是切换详情。对于这种适配场景,列表页和详情页必须在同一个 Activity 里了,而这便是我所知道的 Fragment 诞生的场景了。
116 0
|
11月前
|
XML API Android开发
Fragment初识
Fragment初识
54 0
|
XML ARouter API
Fragivity:像使用Activity一样使用Fragment
近年来,SPA,即单Activity架构逐渐开始受到欢迎,随之而生了很多优秀的三方库,大部分是基于Fragment作为实现方案,Fragivity 使用 Fragment + Navigatiion 打造最好用的 SPA 框架
417 0
|
Java
为Fragment也写一个ViewInject
title: 为Fragment也写一个ViewInject date: 2018-10-28 11:29:51 tags: fragment ViewInject 1.简介 鸿洋博客:https://blog.csdn.net/lmj623565791/article/details/39269193 前段时间根据鸿洋的博客,写了一个ViewInject,本以为可以和findViewById说再见了,但是今天在fragment中使用ViewInject,却报了空指针的错误,原来是控件没有实例化就调用了。
1123 0
|
Android开发 开发者 容器
Fragment详解
前言 谢谢你那么的、安静的捧场。 Fragment的概述及其设计初衷 Fragment代表了Activity的子模块,因此可以把Fragment理解成Activity片段。
1129 0
|
XML Android开发 数据格式
怎么知道Fragment属于哪个Activity呢?
如果程序是一条线运行的,Fragment 中 getActivity() 是获取的上一个打开或者执行的Activity中的值。   多个Activity也是如此,就看顺序是怎么执行的,getActivity获得的是当前Activity的上下文,也就是上一个Activity的值。
1125 0
Activity往另外一个Activity传值,Fragment获取另外一个Activity里面的值。
在oneActivity中实现跳转到MainActivity        //intent 用来跳转另外一个MainActivity,bundle传值到MainActivity         Intent MainActivity = new Intent();         MainActivity .
1252 0