在onActivityResult中,resultCode为0且data为零。

3

我有一个带有一个片段的活动,然后该片段调用某个活动,该活动将向第一个活动提供一些值。我使用onActivityResult,但我不知道为什么resultCode始终为0,data始终为零。

在第一个活动中,我有:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: "+ requestCode +" "+resultCode+" "+data);

}

Activity one包含一些名为fragmentX的片段,这些片段调用了activity two。

private final int REQUEST_CODE = 10;
private void start (){
    Intent intent = new Intent(getContext(),Main2Activity.class);
        intent.putExtra("xxx","test1");
        getActivity().startActivityForResult(intent,REQUEST_CODE);
}

然后在第二个活动中,当我点击返回按钮时,会传递一些值。

public class Main2Activity extends AppCompatActivity {

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

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = getIntent().putExtra("yyy","test2");
        setResult(RESULT_OK,intent);
    }
}

但是,我不知道为什么,在onActivityResult中我无法获取数据。 我的最终目的是将该数据设置为FragmentX的argument。

你需要将活动中的结果传递给片段。 - Divyesh Patel
1
抱歉,我还是不太清楚。 - Frendi
首先从onBackPressed方法中移除super.onBackPressed();这一行代码,然后进行检查。 - Divyesh Patel
如果我移除super.onBackPressed,界面将不会切换到第一个活动。 - Frendi
4个回答

2

1. 您可以在片段中调用onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: "+ requestCode +" "+resultCode+" "+data);

}

2. 在你的方法中使用 setResult 后调用 super.onBackPressed();

@Override
public void onBackPressed() {

    Intent intent = getIntent().putExtra("yyy","test2");
    setResult(RESULT_OK,intent);
    super.onBackPressed();
}

在你的方法中,在setResult之后使用super.onBackPressed(); 这是最重要的事情。 - Abhay Pratap

0
如果您想在onActivityResult中返回数据,则应该在设置数据后使用super.onBackPressed()方法。

例如:

@Override
public void onBackPressed() {
    val intent = Intent()
    intent.putExtra("IsReturnData", true)
    setResult(RESULT_OK,intent);
    super.onBackPressed();  //write this line at the end of method
}


0

在第一个活动中编写以下代码:

第一种方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

在片段中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment write your logic here
}

第二种方法:(我没有尝试过,但根据文档可能是其中一个原因,请尝试一次)如果不起作用,请使用第一种方法,这是百分之百的解决方案

在这里,当您使用getContext()调用第二个活动时

getContext() - 仅返回当前正在运行的活动的上下文视图。

getActivity() - 返回此片段当前关联的活动。

尝试在调用下一个活动的意图时,使用getActivity()而不是getContext()

例如:

private final int REQUEST_CODE = 10;
Intent intent = new Intent(getActivity(),Main2Activity.class);
intent.putExtra("xxx","test1");
getActivity().startActivityForResult(intent,REQUEST_CODE);

0

启动新活动

private final int REQUEST_CODE = 10;
private void start (){
    Intent intent = new Intent(getContext(),Main2Activity.class);
        intent.putExtra("xxx","test1");
        getActivity().startActivityForResult(intent,REQUEST_CODE);
}

来自第二个活动

public class Main2Activity extends AppCompatActivity {

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

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = getIntent().putExtra("yyy","test2");
        setResult(10,intent);
    }
}

你需要使用一个整数代码来设置你启动第二个活动的方式。你使用代码"10"启动了第二个活动,所以在调用setResult(10, intent)时要使用相同的值。

在onActivityResult中,你需要检查请求代码。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==10){
        if(data!=null)
        {
       //you have to manage your own list of fragments for activity because getSupportFragmentManager().getFragments() is deprecated now.

    //Send data to fragments
    if (arrayFragments != null) {
        for (Fragment fragment : arrayFragments) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
 }
   }

}

记住,你必须使用ArrayList或HashMap来管理自己的片段列表。 如果你需要其他帮助,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接