Fragment与Activity的交互
# Fragment与Activity的交互
# 组件获取
Fragment获取Activity中的组件(强耦合)
getActivity().findViewById()
Activity获取Fragment中的组件(强耦合)
getFragmentManager().findFragmentById()
# 数据传递
# Activity传递数据给Fragment
在Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle)
从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments
获得 Bundle对象,然后进行解析就可以了
在Fragment中:
public class MyFragment extends Fragment {
// 方便复用
public static final String BUNDLE_CONTEXT = "bundle_context";
public String context_ans;
public static MyFragment newInstance(String context) {
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString(BUNDLE_CONTEXT, context);
fragment.setArguments();
return fragment;
}
// onCreate()或者onActivityCreated()接收
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getArguments() != null) {
// context_ans = "test"
context_ans = getArguments().getString(BUNDLE_CONTEXT);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在MainActivity中向Fragment传递数据
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFragmentManager()
.beginTransaction()
.add(R.id.xx, MyFragment.newInstance("test")) //传递test到MyFragment中
.commit();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# Fragment传递数据给Activity
在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口, Fragment就可以通过回调接口传数据了
见下
# Fragment与Fragment之间的数据互传
找到要接受数据的fragment对象,直接调用setArguments
传数据进去就可以了 通常的话是replace时,即fragment跳转的时候传数据的,那么只需要在初始化要跳转的Fragment 后调用他的setArguments
方法传入数据即可!
如果是两个Fragment需要即时传数据,而非跳转的话,就需要先在Activity获得f1传过来的数据, 再传到f2了,就是以Activity为媒介~
FragmentManager fManager = getSupportFragmentManager( );
FragmentTransaction fTransaction = fManager.beginTransaction();
Fragmentthree t1 = new Fragmentthree();
Fragmenttwo t2 = new Fragmenttwo();
Bundle bundle = new Bundle();
bundle.putString("key",id);
t2.setArguments(bundle);
fTransaction.add(R.id.fragmentRoot, t2, "~~~");
fTransaction.addToBackStack(t1);
fTransaction.commit();
2
3
4
5
6
7
8
9
10
# Fragment与Activity的最佳通信原则
Fragment与其所附着的Activity之间(或其他Fragment)的通信原则:
Fragment与Activity之间的通信,或者所有的Fragment之间的通信都应该通过他们所属的Activity来完成,不能是多个Fragment之间直接通信、调用(耦合性太强)
Fragment与其所附着的Activity之间(或其他Fragment)的通信最佳方式:
- 在发起事件的Fragment中定义一个接口,接口中声明你的方法(Fragment做事件的发起者)
- 在onAttach方法中要求Activity实现该接口
- 在Activity中实现该方法(Activity作为实现者)
# 回调接口
Step 1:定义一个回调接口:(Fragment中)
Step 2:接口回调(Fragment中)
package top.iqqcode.callback04;
import android.content.Context;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
/**
* @Author: iqqcode
* @Date: 2021-03-27 08:36
* @Description:
*/
public class NewItemFragment extends Fragment {
// 声明一个接口,定义你要向Activity传值的方法
public interface OnNewItemAddListener {
void onNewItemAdd(String content);
}
// 声明一个接口引用变量
private OnNewItemAddListener onNewItemAddListener;
/**
* 当该Fragment被添加到Activity中会回调,只会被调用一次
*
* @param context
*/
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
// 要求该Fragment所附着的Activity必须完成这个方法实现
try {
onNewItemAddListener = (OnNewItemAddListener) context;
} catch (ClassCastException e) {
throw new RuntimeException(context + "Activity必须声明该接口");
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.new_item_fragment, container, false);
EditText mEditText = view.findViewById(R.id.et_input_list);
// 绑定键盘事件
mEditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// 按下键盘
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// 输入完成
if (keyCode == KeyEvent.KEYCODE_ENTER) {
String content_edit = mEditText.getText().toString();
// 接口回调
onNewItemAddListener.onNewItemAdd(content_edit);
mEditText.setText("");
return true;
}
}
return false;
}
});
return view;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Step 3:使用接口回调方法读数据(Activity中)
public class MainActivity extends AppCompatActivity implements NewItemFragment.OnNewItemAddListener {
@Override
public void onNewItemAdd(String content) {
// 加入数据源
list.add(content);
// 更新UI
adapter.notifyDataSetChanged();
}
}
2
3
4
5
6
7
8
9