这位大神的博客很值得大家好好读读。http://blog.csdn.net/lmj623565791/article/details/37970961
碎片的简单用法
使用静态的方式来添加两个碎片步骤:
1、写好两个碎片布局,一个左一个右。布局就是看你要展示什么东西啦。
2、分别为两个布局新建LeftFragment类和RightFragment类,继承自Fragment。用于将布局载入。
3、修改activity_main.xml中的文档,将两个fragment静态添加到其中去。
写一下在其中比较重要的地方:
在步骤2中,我们需要重写Fragment的onCreateView()方法,然后在这个方法中通过LayoutInflater的Inflate()方法将定义的布局文件加载进来。
看一下代码:
public class LeftFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment,container,false);
return view;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment,container,false);
return view;
}
}
做完以上后,我们需要修改activity_main.xml中的内容,即添加两个fragment。看代码:
<
fragment
android :layout_width= "0dp"
android :layout_height= "match_parent"
android :id= "@+id/left_fragment"
android :name= "com.example.yawen_li.fragment.LeftFragment"
android :layout_weight= "1"
android :layout_width= "0dp"
android :layout_height= "match_parent"
android :id= "@+id/left_fragment"
android :name= "com.example.yawen_li.fragment.LeftFragment"
android :layout_weight= "1"
tools:layout="@layout/left_fragment" />
做完这些后就完成了,很简单是不是?但fragment的用处远不止这些,动态转换才是他最厉害的地方!接下来我们就来看看动态添加碎片
动态添加碎片
我们继上面的例子来扩展一下,设置成这样的情景:第一次显示时页面上看到左1和右1,点击一下左1中的按钮,右1变成右2。
我们先确定一下要做的事情:
1、写一下右2的布局文件
2、为右2布局新建Another_RightFragment类,将布局载入
3、修改一下activity_,main.xml中的文档
4、在MainActivity中添加一个Button的点击事件,并在该事件中写好fragment是如何替换的。(这里将是动态添加碎片的重点部分,一会我们细说)
好了,以上就是动态添加碎片的主要流程,让我们开始吧!
1、 2部分和前面是一样的,忘记的同学翻到前面去看一下就好,就是写一个布局,然后重新fragment的onCreateView方法把布局加载进去。
我们看一下步骤3中的activity_main.xml到底改变了哪些,看代码
<
FrameLayout
android :id= "@+id/right_layout"
android :layout_width= "0dp"
android :layout_height= "match_parent"
android :layout_weight= "1">
< fragment
android :layout_width= "match_parent"
android :layout_height= "match_parent"
android :id= "@+id/right_fragment"
android :name= "com.example.yawen_li.fragment.RightFragment"
tools :layout= "@layout/right_fragment" />
android :id= "@+id/right_layout"
android :layout_width= "0dp"
android :layout_height= "match_parent"
android :layout_weight= "1">
< fragment
android :layout_width= "match_parent"
android :layout_height= "match_parent"
android :id= "@+id/right_fragment"
android :name= "com.example.yawen_li.fragment.RightFragment"
tools :layout= "@layout/right_fragment" />
</FrameLayout>
我们可以看到原本裸露在外面的fragment现在由一个FrameLayout(帧布局)包裹了起来。由于这里仅仅需要在布局里面放入一个碎片,所以对于FrameLayout来说是很合适的。
之后我们将在代码中替换FrameLayout里的内容,从而实现动态添加碎片的功能。
步骤4,接下来让我们来看MainActivity中的代码。
public class MainActivity
extends AppCompatActivity
implements View.OnClickListener {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
btn = (Button) findViewById(R.id. btn);
btn.setOnClickListener((View.OnClickListener) this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
btn = (Button) findViewById(R.id. btn);
btn.setOnClickListener((View.OnClickListener) this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
Another_RightFragment fragment = new Another_RightFragment();//创建待添加的实例
FragmentManager fragmentManager = getFragmentManager(); //获取到FragmentManager
//开启一个事务,通过fragmentManager.beginTransaction()方法来开启
FragmentTransaction transaction = fragmentManager.beginTransaction();
//使用事务的replace()方法,向容器中添加碎片,传入一个容器的id,还有碎片的实例
transaction.replace(R.id.right_layout,fragment);
transaction.addToBackStack(null); //添加到碎片栈中,方便返回时调用。(按返回找到上一个碎片)
transaction.commit(); //提交事务,调用commit()方法
break;
default:
break;
}
}
default:
break;
}
}
}
在细说动态添加碎片之前,我们需要注意的一点是,该MainActivity在实现时需要实现View.OnClickListener这个接口,在我理解来是这样的:
fragment和Activity是很相似的,在同一个屏幕上当我们需要显示两个fragment时,其中各自的事件需要响应还得确定到底是哪个fragment中的组件被选中了,所以我们需要的是View这个值,也就出现了在点击事件中view.getId()这个方法了。
好了,说了这么多该把正主搬出来了。看看上面的代码,我在这总结一下动态添加的步骤
1、创建待添加的实例
2、获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到
3、开启一个事务,通过调用beginTransaction()方法开启
4、向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id 和待添加的碎片实例
5、提交事务,调用commit()方法来完成。
就是这样,就是这么简单~
在这里,需要介绍一下Fragment的生命周期:
onAttach //创建与Acitvity的连接,绑定在一起
onCreate //创建Fragment
onCreateView//创建View
onActivityCreated//创建出Activity
onStart //开启活动
onResume //我也不知道啊、、、
onPause //暂停
onStop //停止该Fragment
onDestoryView//销毁View
onDestory //销毁Fragment
onDetach //撤销与Activity的连接
有关fragment的生命周期在这篇博客中写的很详细。我们应该牢记生命周期的那两张图,严格按照顺序来走,才能理解Fragment和Activity是如何绑定在一起的,Fragment是如何依赖Activity进行活动的。