onActivityResult return 数据从片段到 activity

onActivityResult return data from fragment to activity

我有一个 activity A,它使用 startActivityForResult 打开一个 activity B。

现在在 activity B 中,它是一个 activity 片段容器,它还包含一个带有菜单项的 ActionBar

现在,每当我在 activity B 中按下操作栏按钮时,它应该 return 来自 activity B 的选定片段的数据而不是它的持有者,而是应该 return数据到 activity A 因为它是发射者。

所以它基本上是将数据片段(在 activity B 内)传递给 activity B,然后传递给 Activity A。

我正在绝望地寻找解决方法。有什么办法可以做到吗?

您可以在 A activity 中声明静态变量并从 B activity

中设置它

或者您可以创建静态 class 并从 B Activity 设置变量值并在 A activity

中获取它

或者您可以在退出 Activity B 并使用 bundle

启动 activity A 时将菜单值从 Activity B 发送到 A

这就是你如何设置要传递给 activity A in activity B

的数据
  val resultIntent = Intent()
        resultIntent.putExtra(DATA, "closed")
        setResult(Activity.RESULT_OK, resultIntent)
        finish()

这就是您在 activity A

中获取数据的方式
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            super.onActivityResult(requestCode, resultCode, data)
            if (requestCode == FILE_UPLOAD_CODE) {
                when (resultCode) {
                    Activity.RESULT_OK -> {
                                      // data here is obtained data of the method paramater
                     }}}}

免责声明有很多方法,这是我比较喜欢的一种,不是最好的,也不是最完美的,我就是喜欢这个。

我认为最简单的方法是将数据从B内部的Fragment传递给ActivityB,然后从ActivityB传递给ActivityA。

步骤 1 将数据从 Fragment 传递到容器 activity 你有很多方法;我通常使用的是使用接口:

为ActivityB创建界面

public interface IActivityB {
    void setDataAAndFinish(whateverType data);
}

在您的 activityB

中实现接口
public class InterventoActivity extends AppCompatActivity implements IInterventoActivity {

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    private Bundle dataA = null;
    @Override
    public void setDataAAndFinish(whateverType data) {
        dataA = data;
        Intent intent = new Intent();
        intent.putExtra("data", data)
        setResult(RESULT_OK, intent);        
        finish();
    }
}

设置 activityA 请求并接受来自 ActivityB

的 return

首先,开始activityB 的结果而不是通常

Intent i = new Intent(this, ActivityB.class);
startActivityForResult(i, 1);

然后读取结果

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             whateverType data = data.getStringExtra("data");
         }     
    }
} 

现在来自片段

((IActivityB)getActivity()).setDataAAndFinish(myDatas);

您需要在 ActivityB 中声明一个函数,如下所示。

public void sendDataBackToActivityA(String dataToBePassedToActivityA) {
    Intent intent = new Intent();
    intent.putExtra("data", dataToBePassedToActivityA);
    setResult(RESULT_OK, intent);
    finish();
}

现在从您从 ActivityB 启动的 Fragment,只需调用从 ActivityB 启动的 Fragment 中的某个操作的方法。因此,您 Fragment 中流程的伪实现应如下所示。在您的 Fragment 中声明此函数,并在您的 Fragment 中对某些操作调用该函数。

public void sendDataToActivityAFromFragment(String dataToBePassed) {
    ((ActivityB)getActivity()).sendDataBackToActivityA(dataToBePassed);
}

我希望这会达到你的目的。

在你的 Activity A.Move 从 activity A 到 b 像这样:-

int YOUR_CODE=101;  // it can be whatever you like
Intent i = new Intent(getActivity(), B.class);                   
startActivityForResult(i,YOUR_CODE);

在你的 Activity B 片段中

Intent resultIntent = new Intent();
resultIntent.putExtra("NAME OF THE PARAMETER", valueOfParameter);
...
setResult(Activity.RESULT_OK, resultIntent);
finish();

并且在你的 Activity A 的 onActivityResult() 函数中这样做:-

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);


     if (resultCode == RESULT_OK) {

         if (resultCode==YOUR_CODE)
         {
           String value = (String) data.getExtras().getString("NAME OF THE PARAMETER");  //get Data here

         }

     }

    }
In kotlin: - 
In class A
startActivityForResult(Intent(context, B::class.java), 143)

  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == 143) {
            if (data!!.extras.get("check").equals("0")) {
                childpager.currentItem = 0
            }
        }
    }

In Class B
 val intent = Intent()
 intent.putExtra("check", "0")
 setResult(Activity.RESULT_OK, intent)