美文网首页
安卓之碎片Fragment

安卓之碎片Fragment

作者: 优疏 | 来源:发表于2016-03-15 16:15 被阅读165次
  • 碎片介绍

  • 碎片使用方式

  • 碎片生命周期

  • 碎片界面滑动


  • 碎片介绍
    碎片是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间。
  • 碎片使用方式
    1)布局文件添加碎片
    在xml文件直接使用fragment标签
    2)动态添加碎片
    可以在程序运行时动态地添加到活动当中,根据具体情况来动态地添加碎片
public class MyFragment extends Fragment {
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState)  {
              View view = inflater.inflate(R.layout.my_fragment, container, false);
              return view;
      }
}

可以将碎片放在一个FrameLayout中,之后我们将在代码中替换FrameLayout里的内容,从而实现动态添加碎片的功能。

MyFragment fragment = new MyFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.right_layout, fragment);
ft.commit(); 

具体步骤:
1.创建待添加的碎片实例
2.获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到
3.开启一个事务,通过调用beginTransaction()方法开启
4.向容器内添加碎片,一般使用repalce()方法实现,需要传入容器id和待添加的碎片
5.提交事务,调用commit()方法来完成
3)碎片中模拟返回栈
模仿类似于返回栈的效果,点击back可以回到上一个碎片,addToBackStack()方法可以用于将一个事务添加到返回栈中。

MyFragment fragment = new MyFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.right_layout, fragment);
ft.addToBackStack(null);
ft.commit(); 

一般传null值,效果是点击back,会发现程序并没有退出,而是回到了MyFragment界面,再次按下back才会退出。

  • 碎片生命周期
    每个碎片在其生命周期内也可能会经历这几种状态:运行状态、暂停状态、停止状态、销毁状态
  1. onAttach()
    当碎片和活动建立关联的时候调用。
  2. onCreateView()
    为碎片创建视图(加载布局)时调用。
  3. onActivityCreated()
    确保与碎片相关联的活动一定已经创建完毕的时候调用。
  4. onDestroyView()
    当与碎片关联的视图被移除的时候调用。
  5. onDetach()
    当碎片和活动解除关联的时候调用
    生命周期图如下:
Paste_Image.png
  • 碎片界面滑动
    1)FragmentTranscation事务add()和replace()方法区别
    使用 FragmentTransaction 的时候,它提供了这样两个方法,一个 add , 一个 replace ,对这两个方法的区别一直有点疑惑。我觉得使用 add 的话,在按返回键应该是回退到上一个 Fragment,而使用 replace 的话,那个别 replace 的就已经不存在了,所以就不会回退了。但事实不是这样子的。add 和 replace 影响的只是界面,而控制回退的,是事务。
    add是把一个fragment添加到一个容器 container 里
    replace是先remove掉相同id的所有fragment,然后在add当前的这个fragment
    在大部分情况下,这两个的表现基本相同。一般会使用一个FrameLayout来当容器,而每个Fragment被add 或者 replace 到这个FrameLayout的时候,都是显示在最上层的。所以你看到的界面都是一样的。但是,使用add的情况下,这个FrameLayout其实有2层,多层肯定要比一层的来得浪费,所以还是推荐使用replace。当然有时候还是需要使用add的。比如要实现轮播图的效果,每个轮播图都是一个独立的Fragment,而他的容器FrameLayout需要add多个Fragment,这样他就可以根据提供的逻辑进行轮播了。
    而至于返回键的时候,这个跟事务有关,跟使用add还是replace没有任何关系。(需要添加到返回栈中)
    2)FragmentTabHost使用
    注意:Fragment之前切换时每次都会调用onCreateView方法,导致每次Fragment布局都重绘,无法保持Fragment原有状态。解决方法:
private View rootView;// 缓存Fragment view 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) {  
Log.i(TAG, "onCreateView");  
if (rootView == null)  {  
 rootView = inflater.inflate(R.layout.fragment_1, null);
} 
 // 缓存的rootView需要判断是否已经被加过parent,如果有parent需要从parent删除,
//要不然会发生这个rootview已经有parent的错误。
  ViewGroup parent = (ViewGroup) rootView.getParent();  
if (parent != null)  { 
  parent.removeView(rootView); 
 }
  return rootView;
 }
Paste_Image.png
import com.example.android.supportv4.R;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;i
mport android.support.v4.app.FragmentTabHost;
/** * This demonstrates how you can implement switching between the tabs of a * TabHost through fragments, using FragmentTabHost. */
public class FragmentTabs extends FragmentActivity {
    private FragmentTabHost mTabHost;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_tabs); 
       mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
       mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
        mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"), 
               FragmentStackSupport.CountingFragment.class, null);  
      mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
                LoaderCursorSupport.CursorLoaderListFragment.class, null);  
      mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),   
             LoaderCustomSupport.AppListFragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
                LoaderThrottleSupport.ThrottledLoaderListFragment.class, null); 
   }
}

相关文章

  • 安卓之碎片Fragment

    碎片介绍 碎片使用方式 碎片生命周期 碎片界面滑动 碎片介绍碎片是一种可以嵌入在活动当中的UI片段,它能让程序更加...

  • 简单了解Fragment

    简介Fragment是安卓3.0引入的一个东西,称作“碎片”。 目的初衷就是为了适应大屏幕的平板电脑。而且安卓的机...

  • Fragment安卓练习

    2016.11.14 Fragment安卓练习

  • Android Fragment使用和注意事项

    Fragment的中文含义是碎片,在之前安卓开发是,用户界面的切换全部使用activity的切换,这就造成了整个应...

  • 安卓Fragment

    Fragment 与Activity 如何互相传值 Fragment传值给Activity: 当Fragment与...

  • 安卓Fragment使用详解

    Fragment是在安卓3.0版本中添加的,主要是为了解决安卓设备尺寸多样化后界面的显示问题。Fragment比A...

  • 安卓基础--fragment

    本文是我学习安卓的笔记的一部分,查看详细完整笔记请参阅 简介 fragment中文译为碎片,可以嵌入活动中,让程序...

  • 玩安卓---Fragment

    注意Fragment中的几个方法的使用

  • 学习安卓开发[3] - 使用RecyclerView显示列表

    在上一篇学习安卓开发[2] - 在Activity中托管Fragment中了解了使用Fragment的好处和方法,...

  • 判断fragment显示和隐藏

    一、使用show和hide来显隐的Fragment 二、在ViewPager中的Fragment 现在安卓市场上基...

网友评论

      本文标题:安卓之碎片Fragment

      本文链接:https://www.haomeiwen.com/subject/vbqqlttx.html