月度归档:2014年06月

Fragment简单上手

刚开始接触android开发,我们知道一个界面就是一个Activity.那Fragment拿来干什么呢?我们先从名字上看,Fragment的中文意思是”碎片”,我们就可以简单理解Fragment可以存放一个个我们界面的小碎布,我们可以拼接起多个小碎布在一个平面里(一个Activity里多个Fragment).或者我们可以更加简单(不是很准确)的理解,我们就把Fragment当Activity使用,不同就是Fragment可以动态改变.

Fragment说明

一个Activity里两个Fragment的示例

简单实用方法(这里只说动态的添加方法,不说静态):

  • 首先,我们得有一个容器来放Fragment的布局

建一个xml(叫main.xml),作为放Fragment的容器这个标签叫FrameLayout

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

这个就像是一个空白的白板可以放入其他的布局

  • 我们要有个继承自Fragment的类(这就相当于Activity),这里填充我们要添加的新界面的xml布局文件
public class FragmentExample extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.要填充的layout名字, container, false);
        return  view;
    }
}

这里我们只Override一个onCreateView方法,里面填充我们页面的layout.(就是当这个Fragment的view创建的时候做的事情)类似Activity的onCreate.(注意Fragment也有自己的生命周期也有onCreate方法,具体请看google文档).

  •  每个Fragment都要住(host)在一个Activity里,里面调用一个FragmentManager,来管理Fragment
  public class OneActivity extends FragmentActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 找到放container的layout
        setContentView(R.layout.main);
        // 这里是用来support class 如果你目标是3.0以上就可以直接用FragmentManager就好了
        FragmentManager manager = getSupportFragmentManager();
        Fragment fragment = manager.findFragmentById(R.id.frame_container);
        
        // 可能fragment已经存在了(和生命周期有关)
        if (fragment == null){
            // 创建刚才建立的Fragment
            fragment = new ExampleFragment();
            // 把它添加给Fragment Manager
            manager.beginTransaction()
                .add(R.id.frame_container,fragment)
                .commit();
        }
    }
  }

 

这样这个Activity里就填充了刚才new的Fragment了.

用一个新的Fragment代替当前的Fragment

// 把新的Fragment替换到当前的fragment_container里
transaction.replace(R.id.fragment_container, newFragment);
// 加到statck里让用户按back的时候还可以回来
transaction.addToBackStack(null);

// 添加到FragmentManger 里
transaction.commit();