Android Fragment onActivityResult

在Android开发中,Fragment是一种可重用的UI组件,用于构建灵活的用户界面。Fragment可以在Activity中嵌套使用,以实现模块化和可复用的设计。当Fragment需要与Activity或其他Fragment进行通信时,我们可以使用onActivityResult方法来获取返回结果。

onActivityResult方法的作用

onActivityResult方法是在Fragment接收到Activity返回结果时被调用的。它通常用于获取其他Activity的结果或处理其他Fragment的回调。当Activity启动一个新的Activity或Fragment,并通过startActivityForResult方法或Fragment.startActivityForResult方法发送了一个请求码(requestCode),当新的Activity或Fragment完成操作后,会通过setResult方法将结果返回给调用方,同时会触发调用方的onActivityResult方法。

onActivityResult方法的实现步骤

下面是使用onActivityResult方法的一般步骤:

  1. 在调用方的Activity中,使用startActivityForResult方法或者在调用方的Fragment中,使用Fragment.startActivityForResult方法启动目标Activity或Fragment,并传递请求码(requestCode)。
// Activity中启动目标Activity
Intent intent = new Intent(this, TargetActivity.class);
startActivityForResult(intent, REQUEST_CODE);

// Fragment中启动目标Fragment
Intent intent = new Intent(getActivity(), TargetFragment.class);
startActivityForResult(intent, REQUEST_CODE);
  1. 在目标Activity或Fragment中,通过setResult方法将结果返回给调用方,并传递结果码(resultCode)和结果数据(data)。
// Activity中返回结果
Intent resultIntent = new Intent();
resultIntent.putExtra("key", value);
setResult(Activity.RESULT_OK, resultIntent);
finish();

// Fragment中返回结果
Intent resultIntent = new Intent();
resultIntent.putExtra("key", value);
getActivity().setResult(Activity.RESULT_OK, resultIntent);
getActivity().finish();
  1. 在调用方的Fragment中,重写onActivityResult方法,处理返回结果。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        // 处理返回结果
        String result = data.getStringExtra("key");
        // ...
    }
}

示例

假设我们有一个包含两个Fragment的Activity,分别是MainFragmentDetailFragment。在MainFragment中,我们可以通过点击按钮来启动DetailFragment,并传递一些数据。当DetailFragment完成操作后,会将结果返回给MainFragmentMainFragment通过onActivityResult方法获取结果并进行处理。

// MainFragment.java
public class MainFragment extends Fragment {

    private static final int REQUEST_CODE = 1;

    private Button button;

    // ...

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);
        
        button = view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), DetailActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
            }
        });
        
        return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            String result = data.getStringExtra("key");
            // 处理返回结果
            // ...
        }
    }
}

// DetailActivity.java
public class DetailActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        
        // ...
        
        setResult(Activity.RESULT_OK, resultIntent);
        finish();
    }
}

在上述示例中,我们在MainFragment中启动DetailActivity,并在DetailActivity中设置了返回结果。当DetailActivity关闭时,onActivityResult方法会被调用,并处理返回结果。

总结:

onActivityResult方法是Android中用于在Fragment中接收返回结果的重要方法。通过它,我们可以实现Activity与Fragment的双向通信,使得Fragment能够与Activity及其他Fragment进行交互。在实际开发中,我们应根据需求合理地使用onActivityResult方法,提高代码的灵活性和可维护性。