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)
我有一个 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)