Android 从片段调用活动,然后返回到片段

Android 从片段调用活动,然后返回到片段,android,android-fragments,Android,Android Fragments,我有一个有几个标签的应用程序。这些选项卡都是片段。在第一个选项卡片段上,我有一个文本视图和一个按钮,按下该按钮可调用活动 此活动显示项目、车辆名称的列表 我希望能够单击列表中的一辆车,然后返回调用片段,并用我选择的车名更新文本视图 有人能帮我解决这个问题吗?请致电startActivityForResult(内容1) 在“活动开始”中,一旦用户选择了一辆汽车,请确保将汽车置于意图中,并将活动结果设置为该意图 Intent returnIntent = new Intent(); returnIn

我有一个有几个标签的应用程序。这些选项卡都是片段。在第一个选项卡片段上,我有一个文本视图和一个按钮,按下该按钮可调用活动

此活动显示项目、车辆名称的列表

我希望能够单击列表中的一辆车,然后返回调用片段,并用我选择的车名更新文本视图


有人能帮我解决这个问题吗?

请致电
startActivityForResult(内容1)

在“活动开始”中,一旦用户选择了一辆汽车,请确保将汽车置于意图中,并将活动结果设置为该意图

Intent returnIntent = new Intent();
returnIntent.putExtra("result", theCar);
setResult(RESULT_OK, returnIntent);     
finish();
然后,在片段中,在ActivityResult上实现

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (requestCode == 1) {

     if(resultCode == RESULT_OK){      
         String result = data.getStringExtra("result");          
     }
     if (resultCode == RESULT_CANCELED) {    
         //Write your code if there's no result
     }
  }
}  //onActivityResult
确保也覆盖片段的宿主活动中的
onActivityResult()
,并调用super

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

这是因为父活动劫持了onActivityResult方法,如果您不调用super(),那么它就不会被传递到片段来处理它。因此,一个简单的例子(对数据结构进行超基本假设——根据需要进行替换)是让片段覆盖ActivityResult()
,定义请求代码,然后使用该请求代码启动活动:

// Arbitrary value
private static final int REQUEST_CODE_GET_CAR = 1;

private void startCarActivity() {
    Intent i = new Intent(getActivity(), CarActivity.class);
    startActivityForResult(i, REQUEST_CODE_GET_CAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // If the activity result was received from the "Get Car" request
    if (REQUEST_CODE_GET_CAR == requestCode) {
        // If the activity confirmed a selection
        if (Activity.RESULT_OK == resultCode) {
            // Grab whatever data identifies that car that was sent in
            // setResult(int, Intent)
            final int carId = data.getIntExtra(CarActivity.EXTRA_CAR_ID, -1);
        } else {
            // You can handle a case where no selection was made if you want
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}
然后,在
CarActivity
中,无论您在哪里为列表设置单击侦听器,都要设置结果,并在
意图中传回所需的任何数据:

public static final String EXTRA_CAR_ID = "com.my.application.CarActivity.EXTRA_CAR_ID";

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // Assuming you have an adapter that returns a Car object
    Car car = (Car) parent.getItemAtPosition(position);
    Intent i = new Intent();

    // Throw in some identifier
    i.putExtra(EXTRA_CAR_ID, car.getId());

    // Set the result with this data, and finish the activity
    setResult(RESULT_OK, i);
    finish();
}
公共静态最终字符串EXTRA\u CAR\u ID=“com.my.application.CarActivity.EXTRA\u CAR\u ID”; @凌驾 public void onItemClick(AdapterView父对象、视图、整型位置、长id){ //假设您有一个适配器返回一个Car对象 Car Car=(Car)parent.getItemAtPosition(位置); 意图i=新意图(); //加入一些标识符 i、 putExtra(EXTRA_CAR_ID,CAR.getId()); //使用此数据设置结果,然后完成活动 setResult(结果_OK,i); 完成(); }
您可能应该考虑使用或调用
startActivityForResult
注意,如果托管活动覆盖了onActivityResult()方法,那么它也应该调用super.onActivityResult(requestCode、resultCode、data),这样片段就有机会接收到它。是的,这是一件需要确保的好事情。由于没有调用超级实现的严格要求,因此很容易放弃并花费数小时进行调试。:)谢谢,Rperryng。我也会接受你的回答,但@kcopock似乎只比你领先了几分钟。你对重写超级方法的解释太棒了。