onActivityResult将数据从片段返回到活动

时间:2018-04-19 10:19:04

标签: android

我有一个活动A,它使用startActivityForResult打开活动B.

现在在活动B中,它是一个活动片段持有者,它包含一个带有菜单项的ActionBar

现在每当我按下活动B中的操作栏按钮时,它应该将活动B的选定片段中的数据返回给其持有者,而不是将数据返回到活动A,因为它是执行启动的人。 / p>

所以它基本上将数据片段(在活动B内)传递给活动B,然后传递给活动A.

我正在无望地寻找解决方法。有没有可行的办法呢?

6 个答案:

答案 0 :(得分:2)

免责声明有很多方法,这是我喜欢的方式,不是最好的而不是完美的方式,我就是这样。

在我看来,最简单的方法是将数据从B内的Fragment传递到ActivityB,然后从ActivityB传递到ActivityA。

第1步将数据从Fragment传递到容器活动,您有很多方法;我通常使用的是使用接口:

为ActivityB创建界面

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.10/css/all.css" integrity="sha384-+d0P83n9kaQMCwj8F4RJB66tzIwOKmrdb46+porD/OvrJ+37WqIM7UoBtwHO6Nlg" crossorigin="anonymous">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="height=device-height, initial-scale=1">
<style>
.item {
  display: table;
  width: auto;
  height: auto;
  word-break: break-all;
  white-space: nowrap;
  border: 1px;
  border-style: solid;
  border-color: silver;
  border-radius: 4px;
}
@-ms-viewport {
 width: device-width;
}
.awesome {
  padding: 10px 0;
  box-shadow: none;
  border-radius: 0;
  background: none;
  text-align: center;
  color: #30a5ff;
  top: 105px;
  text-align: center font-size: 1em;
}


/*
.fa-check-square:before {
  top: 15px;
  right: 16px;
  font-size: 5em;
  color: coral;
  display: table-cell
} */
</style>
</head>
<body>
<div gridster="gridsterOpts" align="center">
  <ul>
    <li gridster-item="item" ng-repeat="item in Items" class="item" align="center">
      <h2 class="awesome" align="right">Hello world! <i class="fa fa-check-square" aria-hidden="true"></i></h2>
    </li>
  </ul>
</div>
</body>
</html>

在您的activityB中实施界面

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

设置activityA以请求并接受来自ActivityB的返回

首先,为结果启动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();
    }
}

然后阅读结果

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");
         }     
    }
} 

答案 1 :(得分:1)

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

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

现在,您从Fragment发起的ActivityB来调用Fragment中从ActivityB启动的Fragment中某些操作的方法。因此,Fragment中的流程的伪实现应如下所示。在Fragment中声明此功能,并在public void sendDataToActivityAFromFragment(String dataToBePassed) { ((ActivityB)getActivity()).sendDataBackToActivityA(dataToBePassed); } 中的某些操作上调用该功能。

<application>
  <activity android:name=”MainActivity”>
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https" android:host="www.example.com" />
      <data android:scheme="https" android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

我希望这符合您的目的。

答案 2 :(得分:0)

您可以在A活动中声明静态变量,并从B活动

中设置它

或者您可以从B活动中创建静态类并设置变量值,并在A活动

中获取它

或者您可以在退出活动B时将活动B中的菜单值发送到A并使用捆绑包启动活动A

答案 3 :(得分:0)

这是设置要传递给活动B中的活动A的数据的方式

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

这是您在活动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
                     }}}}

答案 4 :(得分:0)

在您的活动A.从活动A到b移动,如下所示: -

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

在活动B的片段中

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

活动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

         }

     }

    }

答案 5 :(得分:0)

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)