Android学习之Fragment使用
静态加载方法
静态加载Fragment流程:
1. 编写Fragment的xml布局文件;
2. 继承Fragment类,实现自己的Fragment类,同时,实现onCreateView()方法,并在其中使用inflater.inflate加载布局文件,返回View;
3. 在需要加载Fragment的Activity的布局文件中,添加fragment控件,并将name属性填写为刚刚自定义的Fragment类;
4. 正常加载Activity的布局文件即可。
<!-- 第一步 -->
<!-- left_fragment.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00FF00"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Left Fragment"
android:textColor="#000000"
android:textSize="24sp" />
</LinearLayout>
<!-- right_fragment.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Right Fragment"
android:textColor="#000000"
android:textSize="24sp" />
</LinearLayout>
// 第二步
// LeftFragment.java
public class LeftFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
return inflater.inflate(R.layout.left_fragment, container, false);
}
}
// RightFragment.java
public class RightFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.right_fragment, container, false);
}
}
<!-- 第三步 -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<fragment
android:id="@+id/headlines_fragment"
android:name="demo.show.fragments.LeftFragment"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1" />
<fragment
android:id="@+id/article_fragment"
android:name="demo.show.fragments.RightFragment"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
// 第四步
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
运行结果
注意,继承Fragemet类导包时,如果使用了v4的库,那么,Activity就应该继承自FragmentActivity,使用app.Fragment则不用。
动态加载方法
动态加载Fragment流程:
1. 获得FragmentManager对象,通过getFragmentManager();
2. 获得FragmentTransaction对象,通过getFragmentManager().beginTransaction();
3. 调用add()方法或者replace()方法加载Fragment;
4. 加载完成后使用commit()方法提交。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
if(size.x > size.y) {
HorizontalFragment horizontalFragment = new HorizontalFragment();
getFragmentManager().beginTransaction().replace(R.id.fl_content,
horizontalFragment).commit();
} else {
VerticalFragment verticalFragment = new VerticalFragment();
getFragmentManager().beginTransaction().replace(R.id.fl_content,
verticalFragment).commit();
}
}
}
上面的代码就完成了动态Fragment的调动,首先HorizontalFragment和VerticalFragment跟静态加载Fragment时用的代码一样,只不过将名字改了,xml文件也是一样的只是改了一个名字。
说明一下replace()方法,这里有两个参数,表示用第二个参数的fragment,替换第一个参数的对应id的容器。例如,上边的代码我将activity_main.xml布局文件中的根布局做了修改,将其掏空了只是放了一个FragmentLayout布局作为根容器,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
而上边replace(R.id.fl_content, horizontalFragment)就表示用horizontalFragment替换掉R.id.fl_content这个容器,这样就实现了动态加载Fragment了,实现效果如下:
Fragment传值
Activity给Fragment传递数据
1. 首先创建Bundle对象,并设置要传递数据
2. 使用Fragment对象的setArguments()方法,将Bundle对象传递过去
3. 在Fragment中使用getArguments()方法获取即可使用
// 修改之前MainActivity.java代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
// 创建Bundle对象
Bundle bundle = new Bundle();
bundle.putString("msg", "这是来自Activity的消息");
if(size.x > size.y) {
HorizontalFragment horizontalFragment = new HorizontalFragment();
// 将Bundle对象设置给Fragment
horizontalFragment.setArguments(bundle);
getFragmentManager().beginTransaction().replace(android.R.id.content,
horizontalFragment).commit();
} else {
VerticalFragment verticalFragment = new VerticalFragment();
// 将Bundle对象设置给Fragment
verticalFragment.setArguments(bundle);
getFragmentManager().beginTransaction().replace(android.R.id.content,
verticalFragment).commit();
}
}
// 修改之前的VerticalFragment.java代码,横屏的同理
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 得到Bundle对象
Bundle bundle = getArguments();
// 获得字段
String message = bundle.getString("msg");
// 显示
Toast.makeText(getActivity().getApplicationContext(), message, Toast.LENGTH_SHORT).show();
return inflater.inflate(R.layout.vertical_fragment, container, false);
}
注意:getActivity()方法使用来获取Activity对象的,此方法可以使用Activity的公共方法或者参数,例如,getActivity().findViewById()。
效果如下:
Fragment给Activity传递数据
使用回调接口的方式实现,首先在Fragment中定一个回调接口,如下:
/**
* 接口
*/
public interface CallBack {
/**
* 回调方法
* @param msg 传回来的信息
*/
void getResult(String msg);
}
然后,还是在Fragment中设定一个接口回调的函数
/**
* 接口回调函数
* @param callBack 接口对象
*/
public void getData(CallBack callBack) {
// 根据实际情况传递参数,这里写String
String msg = "回传一个字符串参数!";
callBack.getResult(msg);
}
最后,在MainActivity中调用该方法即可
verticalFragment.getData(new VerticalFragment.CallBack() {
@Override
public void getResult(String msg) {
// msg就是回传的数据
}
});
Fragment给Fragment传递数据
这个传递有两种情况,
1. 直接跳转有F1跳转到F2时可以使用setArguments()传递即可。
2. 如果非跳转关系,那么就先在Activity中接收F1,然后传递给F2。
以上是关于Fragment使用方式的学习和理解!
推荐阅读
-
Android中使用开源框架eventbus3.0实现fragment之间的通信交互
-
Android开发之缓冲dialog对话框创建、使用与封装操作
-
Android学习笔记45之gson解析json
-
Android数据存储之SQLite使用
-
Android 开发之Dialog中隐藏键盘的正确使用方法
-
Android ListView之setEmptyView正确使用方法
-
Android开发之使用GridView展示图片的方法
-
Android使用Fragment打造万能页面切换框架
-
Spring学习笔记之RedisTemplate的配置与使用教程
-
Android学习笔记之ListView复用机制详解