我有一个活动A,它使用startActivityForResult
打开活动B.
现在在活动B中,它是一个活动片段持有者,它包含一个带有菜单项的ActionBar
。
现在每当我按下活动B中的操作栏按钮时,它应该将活动B的选定片段中的数据返回给其持有者,而不是将数据返回到活动A,因为它是执行启动的人。 / p>
所以它基本上将数据片段(在活动B内)传递给活动B,然后传递给活动A.
我正在无望地寻找解决方法。有没有可行的办法呢?
答案 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)