【问题标题】:Calling Activity from Fragment then return to Fragment从 Fragment 调用 Activity 然后返回 Fragment
【发布时间】:2014-02-28 00:17:25
【问题描述】:

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

此活动显示项目列表、汽车名称。

我希望能够单击列表中的汽车并返回调用片段并使用我选择的汽车名称更新文本视图。

谁能帮我解决这个问题?

【问题讨论】:

  • 您可能应该考虑使用DialogFragment 或致电startActivityForResult

标签: android android-fragments


【解决方案1】:

startActivityForResult() 可能是您正在寻找的。所以一个简单的例子(对你的数据结构做出超级基本的假设——根据需要替换)是让你的片段覆盖onActivityResult(),定义一个请求代码,然后使用该请求代码启动活动:

// 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 中,无论您为列表设置点击监听器,设置结果并在Intent 中传回您需要的任何数据:

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();
}

【讨论】:

  • 请注意,如果托管活动覆盖了 onActivityResult() 方法,它也应该调用 super.onActivityResult(requestCode, resultCode, data) 以便片段有机会接收它跨度>
  • 是的,这是一件好事。由于调用超级实现没有严格的要求,因此很容易放弃并花费数小时进行调试。 :)
【解决方案2】:

致电startActivityForResult(theIntent, 1);

在启动的 Activity 中,一旦用户选择了汽车,请确保将汽车放入 Intent 并将 Activity 的结果设置为该 Intent

Intent returnIntent = new Intent();
returnIntent.putExtra("result", theCar);
setResult(RESULT_OK, returnIntent);     
finish();

然后,在您的片段中,实现onActivityResult

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(),并调用超级

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

这是因为父activity劫持了onActivityResult方法,如果不调用super()就不会传给fragment去处理

【讨论】:

  • 谢谢,Rperryng。我也会接受你的回答,但@kcoppock 似乎只比你少了几分钟。您对覆盖 super 方法的解释很棒。
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2018-04-14
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多