1 建立基类
- public abstract class Function {
- /** 方法名 */
- public String mFunctionName ;
- public Function (String funName){
- this.mFunctionName = funName;
- }
- }
2 建立无 (有) 参数无 (有) 四类
- /**
- * 无参无返回值
- * <h3>Description</h3>
- * TODO
- * <h3>Author</h3> luzhenbang
- * <h3>Date</h3> 2018/1/4 16:13
- * <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
- */
- public abstract class FunctionNoParamNoResult extends Function {
- public FunctionNoParamNoResult(String funName) {
- super(funName);
- }
- public abstract void function();
- }
- /**
- * 有参无返回值
- * <h3>Description</h3>
- * TODO
- * <h3>Author</h3> luzhenbang
- * <h3>Date</h3> 2018/1/4 16:13
- * <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
- */
- public abstract class FunctionWithParamOnly<Param> extends Function {
- public FunctionWithParamOnly(String funName) {
- super(funName);
- }
- public abstract void function(Param param);
- }
- /**
- * 有参有返回值
- * <h3>Description</h3>
- * TODO
- * <h3>Author</h3> luzhenbang
- * <h3>Date</h3> 2018/1/4 16:13
- * <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
- */
- public abstract class FunctionWithParamWithResult<Result,Param> extends Function {
- public FunctionWithParamWithResult(String funName) {
- super(funName);
- }
- public abstract Result function(Param param);
- }
- /**
- * 无参有返回值
- * <h3>Description</h3>
- * TODO
- * <h3>Author</h3> luzhenbang
- * <h3>Date</h3> 2018/1/4 16:13
- * <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
- */
- public abstract class FunctionWithResultOnly<Result> extends Function {
- public FunctionWithResultOnly(String funName) {
- super(funName);
- }
- public abstract Result function();
- }
3 建立管理器类
- public class FunctionManager {
- private static FunctionManager instance = null;
- public static final String TAG = FunctionManager.class.getSimpleName() + "-------->";
- /** 容器, 用来存储方法名字 key 对应的方法名 value 对应的是 参数返回对象 */
- private HashMap<String,FunctionWithParamWithResult> mFunctionWithParamWithResultHashMap = null;
- private HashMap<String,FunctionWithParamOnly> mFunctionWithParamsOnlyHashMap = null;
- private HashMap<String,FunctionWithResultOnly> mFunctionWithResultOnlyHashMap = null;
- private HashMap<String,FunctionNoParamNoResult> mFunctionNoParamNoResultHashMap = null;
- private FunctionManager() {
- mFunctionNoParamNoResultHashMap = new HashMap<>();
- mFunctionWithParamWithResultHashMap = new HashMap<>();
- mFunctionWithParamsOnlyHashMap = new HashMap<>();
- mFunctionWithResultOnlyHashMap = new HashMap<>();
- }
- public static FunctionManager getInstance() {
- if (null == instance){
- instance = new FunctionManager();
- }
- return instance;
- }
- /**
- * 添加无参无返回值的方法
- * @return
- */
- public FunctionManager addFunction(FunctionNoParamNoResult function){
- mFunctionNoParamNoResultHashMap.put(function.mFunctionName,function);
- return this;
- }
- /**
- * 添加有返回值的方法
- * @return
- */
- public FunctionManager addFunction(FunctionWithResultOnly function){
- mFunctionWithResultOnlyHashMap.put(function.mFunctionName,function);
- return this;
- }
- /**
- * 添加有参数的方法
- * @return
- */
- public FunctionManager addFunction(FunctionWithParamOnly function){
- mFunctionWithParamsOnlyHashMap.put(function.mFunctionName,function);
- return this;
- }
- /**
- * 添加有参有返回值的方法
- * @return
- */
- public FunctionManager addFunction(FunctionWithParamWithResult function){
- mFunctionWithParamWithResultHashMap.put(function.mFunctionName,function);
- return this;
- }
- /**
- * 调用无返回值无参数的方法
- * @param funName
- */
- public void invokeNoAll (String funName) throws NullPointerException {
- if (TextUtils.isEmpty(funName)){
- Log.e(TAG,"funName is null !");
- }else {
- if ( null != mFunctionNoParamNoResultHashMap){
- FunctionNoParamNoResult function = mFunctionNoParamNoResultHashMap.get(funName);
- if (null != function){
- function.function();
- }else {
- Log.e(TAG,"function is null !");
- }
- }else {
- throw new NullPointerException("mFunctionNoParamNoResultHashMap can not be null ,please first init FunctionManager !");
- }
- }
- }
- /**
- * 调用有参数的方法
- * @param funName
- */
- public <Param> void invokeWithParamOnly (String funName,Param param) throws NullPointerException {
- if (TextUtils.isEmpty(funName)){
- Log.e(TAG,"funName is null !");
- }else {
- if ( null != mFunctionWithParamsOnlyHashMap){
- FunctionWithParamOnly<Param> function = mFunctionWithParamsOnlyHashMap.get(funName);
- if (null != function){
- function.function(param);
- }else {
- Log.e(TAG,"function is null !");
- }
- }else {
- throw new NullPointerException("mFunctionWithParamsOnlyHashMap can not be null ,please first init FunctionManager !");
- }
- }
- }
- /**
- * 调用有返回值的方法
- * @param funName
- */
- public <Result> Result invokeWithResultOnly (String funName, Class<Result> c) throws NullPointerException {
- if (TextUtils.isEmpty(funName)){
- Log.e(TAG,"funName is null !");
- }else {
- if ( null != mFunctionWithResultOnlyHashMap){
- FunctionWithResultOnly function = mFunctionWithResultOnlyHashMap.get(funName);
- if (null != function){
- if ( null != c){
- return c.cast(function.function());
- }else {
- return (Result) function.function();
- }
- }else {
- Log.e(TAG,"function is null !");
- }
- }else {
- throw new NullPointerException("mFunctionWithParamsOnlyHashMap can not be null ,please first init FunctionManager !");
- }
- }
- return null;
- }
- /**
- * 调用有参数有返回值的方法
- * @param funName
- */
- public <Result,Param> Result invokeWithAll (String funName, Class<Result> c,Param param) throws NullPointerException {
- if (TextUtils.isEmpty(funName)){
- Log.e(TAG,"funName is null !");
- }else {
- if ( null != mFunctionWithParamWithResultHashMap){
- FunctionWithParamWithResult<Result,Param> function = mFunctionWithParamWithResultHashMap.get(funName);
- if (null != function){
- if ( null != c){
- return c.cast(function.function(param));
- }else {
- return function.function(param);
- }
- }else {
- Log.e(TAG,"function is null !");
- }
- }else {
- throw new NullPointerException("mFunctionWithParamsOnlyHashMap can not be null ,please first init FunctionManager !");
- }
- }
- return null;
- }
- }
4 在 Activity 写一个方法
- public void setFunctionForFragment(String tag){
- if (TextUtils.isEmpty(tag)){
- Log.e(MainActivity.class.getSimpleName(),"tag is null !");
- return;
- }
- BaseFragment fragment = (BaseFragment) fm.findFragmentByTag(tag);
- FunctionManager functionManager = FunctionManager.getInstance();
- functionManager.addFunction(new FunctionNoParamNoResult(FunctionNoParamNoResult) {
- @Override
- public void function() {
- Toast.makeText(MainActivity.this, "无参无返回值", Toast.LENGTH_SHORT).show();
- }
- });
- functionManager.addFunction(new FunctionWithResultOnly<String>(FunctionWithResultOnly) {
- @Override
- public String function() {
- return "无参有返回值";
- }
- });
- functionManager.addFunction(new FunctionWithParamOnly<String>(FunctionWithParamOnly) {
- @Override
- public void function(String o) {
- Toast.makeText(MainActivity.this, o, Toast.LENGTH_SHORT).show();
- }
- });
- functionManager.addFunction(new FunctionWithParamWithResult<String,String>(FunctionWithParamWithResult) {
- @Override
- public String function(String o) {
- return o;
- }
- });
- fragment.setFunctionManager(functionManager);
- }
5 编辑一个 Fragment 基类(实用 Fragment 的时候直接集成该类就可以了), 并绑定上面建立的接口
- public class BaseFragment extends Fragment{
- public FunctionManager mFunctionManager;
- private MainActivity mainActivity;
- public void setFunctionManager(FunctionManager mFunctionManager) {
- this.mFunctionManager = mFunctionManager;
- }
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- if (context instanceof MainActivity) {
- mainActivity = (MainActivity) context;
- mainActivity.setFunctionForFragment(getTag());
- } else {
- throw new RuntimeException(context.toString()
- + "must implement OnFragmentInteractionListener");
- }
- }
- @Override
- public void onDetach() {
- super.onDetach();
- mainActivity = null;
- }
- }
6 继承 BaseFragment
- public class NoParamNoResultFragment extends BaseFragment {
- private Handler mHandler;
- public NoParamNoResultFragment(Handler handler) {
- // Required empty public constructor
- this.mHandler = handler;
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- if (getArguments() != null) {
- }
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View view = inflater.inflate(R.layout.fragment_no_param_no_result, container, false);
- view.findViewById(R.id.txt_handle).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Message message = mHandler.obtainMessage();
- message.what = 0x123;
- message.obj = "handle 通信";
- mHandler.sendMessage(message);
- }
- });
- view.findViewById(R.id.txt_noALl).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mFunctionManager.invokeNoAll(MainActivity.FunctionNoParamNoResult);
- }
- });
- view.findViewById(R.id.txt_result).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // mFunctionManager.invokeNoAll(MainActivity.FunctionNoParamNoResult);
- String result = mFunctionManager.invokeWithResultOnly(MainActivity.FunctionWithResultOnly,String.class);
- Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
- }
- });
- view.findViewById(R.id.txt_param).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mFunctionManager.invokeWithParamOnly(MainActivity.FunctionWithParamOnly,"有参无返回值");
- }
- });
- view.findViewById(R.id.txt_withAll).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- String result = mFunctionManager.invokeWithAll(MainActivity.FunctionWithParamWithResult,String.class,"有参有返回值");
- Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
- }
- });
- return view;
- }
- }
说明, 上述在点击控件的时候, 会触发在 Activity 添加的方法, 这样就可以实现 Activity 与 Fragment 实时通信, 近而实现 Fragment 之间的通信
https://gitee.com/lzbgit/AppInterface https://gitee.com/lzbgit/AppInterface
来源: https://www.cnblogs.com/ganchuanpu/p/9249764.html