前言
简单记录一下Fragment的使用
提示:以下是本篇文章正文内容,下面案例可供参考
一、Fragment使用场景
Android运行在各种各样的设备中,有小屏幕的手机,还有大屏幕的平板,电视等。同样的界面在手机上显示可能很好看,在大屏幕的平板上就未必了,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况。针对屏幕尺寸的差距,Fragment的出现能做到一个App可以同时适应手机和平板。这就是为什么要有Fragment的原因。
二、Fragment主要特点
Fragment是一种可以嵌入在Activity当中的UI片段。
用来组建Activity界面的局部模块, 也可以说一个Actiivty界面可以由多个Fragment组成。
其行为与Activity很相似, 有自己对应的布局(包含具体的View), 它有自己的生命周期,接收自己的输入事件,并且可以从运行中的activity中添加或移除。
一个fragment必须总是嵌入在一个activity中,同时fragment的生命周期受activity的影响。
优势:
模块化:我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
可重用:多个Activity可以重用一个Fragment。
可适配:根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。
三、Fragment与Activity通信
- Activity–>Fragment: 在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法
- Fragment–>Activity:需要在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口。这样Fragment可调用该回调方法将数据传递给Activity
四、Demo所涉及的部分代码
1.MainActivity的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/change_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="change" />
<Button
android:id="@+id/replace_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="replace" />
<FrameLayout
android:id="@+id/framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cardview_light_background"></FrameLayout>
</LinearLayout>
2.fragment_blank1的布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
tools:context=".BlankFragment1">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="fragment1" />
</FrameLayout>
3.fragment_blank2的布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
tools:context=".BlankFragment1">
<!-- TODO: Update blank fragment layout -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="fragment2" />
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="传递msg到Activity" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="从Activity获取msg" />
</LinearLayout>
</FrameLayout>
4.MainActivity的代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button change_btn;
private Button replace_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
change_btn = findViewById(R.id.change_btn);
replace_btn = findViewById(R.id.replace_btn);
change_btn.setOnClickListener(this);
replace_btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.change_btn:
Bundle bundle = new Bundle();
bundle.putString("msg","i am from MainActivity");
BlankFragment1 blankFragment1 = new BlankFragment1();
blankFragment1.setArguments(bundle);
replaceFragment(blankFragment1);
//replaceFragment(new BlankFragment1());
break;
case R.id.replace_btn:
BlankFragment2 blankFragment2 = new BlankFragment2();
blankFragment2.setFragmentCallBack(new FragmentCallBack() {
@Override
public void sendMsgToActivity(String msg) {
Log.e("MainActivity",msg);
}
@Override
public String getMsgFromActivity(String msg) {
Log.e("MainActivity",msg);
return "从Activity获取的msg";
}
});
replaceFragment(blankFragment2);
break;
}
}
private void replaceFragment(Fragment fragment){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.framelayout,fragment);
// transaction.addToBackStack(null);
transaction.commit();
}
}
5.BlankFragment1的代码
public class BlankFragment1 extends Fragment {
private View root;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
String msg = bundle.getString("msg");
Log.e("BlankFragment1",msg);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (root == null){
root = inflater.inflate(R.layout.fragment_blank1, container, false);
}
return root;
}
}
5.BlankFragment2的代码
public class BlankFragment2 extends Fragment {
private View blankView;
private FragmentCallBack fragmentCallBack;
public void setFragmentCallBack(FragmentCallBack callBack){
fragmentCallBack = callBack;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
if (blankView == null){
blankView = inflater.inflate(R.layout.fragment_blank2, container, false);
}
Button btn1 = blankView.findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentCallBack.sendMsgToActivity("msg from fragment2");
}
});
Button btn2 = blankView.findViewById(R.id.btn2);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = fragmentCallBack.getMsgFromActivity("test");
Log.e("BlankFragment2",msg);
}
});
return blankView;
}
}
6.FragmentCallBack的代码
public interface FragmentCallBack {
void sendMsgToActivity(String msg);
String getMsgFromActivity(String msg);
}