【问题标题】:How do I pass callback function from one fragment inside an Activity to second activity?如何将回调函数从 Activity 中的一个片段传递到第二个 Activity?
【发布时间】:2019-04-26 17:09:41
【问题描述】:

我有一个回调接口。

public interface RowCallback {

    void callOnRowAction(String action);
}

我的片段FragmentA附加到ActivityA,其中FragmentA定义如下:

class FragmentA extends Fragment implements RowCallback {
  @Override
  void callOnRowAction(String action) {
        . . . Custom implementation . . . 
  }

  ... Other methods . . . 
  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_crime_list, container, false);
     mButton = view.findViewById(R.id.my_button);
     mButton.setOnClickListener((view) -> {
        // I want to pass the callback instance (which is FragmentA) to activity B.
        Intent intent = new Intent(getActivity(), ActivityB.class);
        . . .  Some more intent initialisation. . . 
        startActivity(intent);
     });
      return view;
  }


}

ActivityB源码

public class ActivityB extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);

        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.fragment_container);
        if (fragment == null) {
            fragment = createFragment(getIntent());
            fm.beginTransaction().add(R.id.fragment_container, fragment).commit();
        }
    }

   private Fragment createFragment(Intent intent) {
      FragmentB fragment = new FragmentB();
      Bundle bundle = new Bundle();
      . . . . initialise bundle . . . 
      // I want to pass the callback instance from the intent to the callback function.
     // In this example, the callback instance would be an instance of fragment A.
      fragment.setArguments(bundle);
     return fragment;
   }
}

在 FragmentB 的一个实例中,如果满足逻辑条件,我想调用一个回调方法。我想在调用 getActivity().finish(); 调用回调函数后返回到 ActivityA/FragmentA

我怎样才能实现这样的目标?

【问题讨论】:

    标签: android android-fragments android-intent android-activity android-fragmentactivity


    【解决方案1】:

    在片段中实现你希望在执行后回调的函数

        public void testCallBack(Callback callback) {
    
        callback.callOnRowAction("callback");
    
    }
    

    在Activity类中实现这个

       public void getCallBack() {
    
        FragmentA.newInstance().testCallBack(new FragmentA.Callback() {
            @Override
            public void callOnRowAction(String action) {
                //you can do something
            }
        });
    }
    

    如果你想在函数启动时执行 testCallBack 方法,你可以在 onCreate 方法中调用它

    【讨论】:

    • 如何从 ActivityA 的 FragmentA 中已初始化的按钮的单击事件加载 ActivityB?我想在调用回调后返回 ActivityA。所以我会在 FragmentB 的方法中调用回调函数后调用 getActivity().finish()。
    【解决方案2】:

    我会分开回答:

    1. 如果你想要一次回调:

      • 片段 A OnclickListener 将调用他的 Activity(比如说 A)。
      • 活动 A 将执行 StartActivityForResult(intent) 活动 B。
      • 活动 B 将 将片段 B 附加到自己身上。
      • 片段 B OnclickListener 将 更新他的活动 (B)。
      • 活动 B 将返回 IntentResult,活动 A 将在 onActivityResult 上捕获它。
    2. 如果你想多次回调:

    【讨论】:

    • 实际上 FragmentA 的(由 ActivityA 创建)按钮的点击监听器会从 Fragment 中调用 Activity B。所有逻辑都封装在片段中。除了实例化片段之外,Activity 不做任何事情。我希望每次满足 FragmentB 中的逻辑条件时调用回调。例如,如果我在 Fragment B 中有一个回调实例的引用,我只需在 FragmentB 的方法中调用callbackInstance.callOnRowAction("delete");
    • 任务完成后我也想返回ActivityA。
    【解决方案3】:

    你可以在片段里面添加

    if(getParentFragment() instanceof Activity1)
    ((Activity1) getParentFragment()).setRowCallback(this);
    else if(getParentFragment() instanceof Activity2)
    ((Activity2) getParentFragment()).setRowCallback(this);
    

    fragment会自动调用其父activity的回调

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多