【发布时间】:2021-10-18 03:13:38
【问题描述】:
我有一个片段可以打开一个新活动。从这个活动中,一旦按下保存或返回按钮,活动中的数据就会被检索并发送回片段。这至少是我期望发生的。在未按预期工作的设备上,新活动启动,但当返回片段时,接收数据的函数,onActivityResult 来自ActivityResultCallback,不会被调用。此外,返回时显示的片段不是正确的片段。这使我认为片段所在的活动未正确保存,并且显示默认/第一个片段。这不是应用程序中的错误,因此没有任何错误消息。
起初我使用片段类中已弃用的onActivityResult,并尝试将其更改为使用ActivityResultCallback 中的onActivityResult 方法的新方法。但是问题仍然存在,所以我怀疑这是由于 API 版本的问题。这些是我测试过的设备,哪些符合我的预期
| Phone | How it ran |
|---|---|
| Pixel - API 28 - Emulator | As expected |
| Pixel 2 - API 29 - Emulator | As expected |
| Moto x4 - API 28 - Real | As expected |
| Moto g7 Power - API 29 - Real | Not As expected |
我查看了 google 的 ActivityResultLauncher 文档,但无法理解我做错了什么。
这是适用于这个问题的我的代码的 sn-ps。
我有一个名为Intent 的类,我在这个项目中使用过它,它类似于android.content.Intent 的名称。在这些 sn-ps 中,当我为我的 Intent 类引用 android.content.Intent 和 Intent 时,我使用了 android.content.Intent。
PlanFragment.java
public class PlanFragment extends Fragment {
...
ActivityResultLauncher<android.content.Intent> mStartForResult = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
Log.d("Cursor", "OnActivityResult");
if (result.getResultCode() == Activity.RESULT_OK) {
Log.d("Cursor", "OnActivityResultOk");
}
}
});
...
public View onCreateView(...) {
...
FloatingActionButton addIntent = view.findViewById(R.id.add_intent);
addIntent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
android.content.Intent intent = new android.content.Intent(view.getContext(), AddEditIntentActivity.class);
mStartForResult.launch(intent);
}
});
...
}
...
}
AddEditIntentActivity.java
public class AddEditIntentActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
...
private void saveIntent() {
Intent data = new Intent();
data.putExtra(EXTRA_NAME, name);
data.putExtra(EXTRA_DESC, desc);
data.putExtra(EXTRA_IMAGE, image.trim());
data.putExtra(EXTRA_TIME, time);
int id = getIntent().getIntExtra(EXTRA_ID, -1);
if (id != -1) {
data.putExtra(EXTRA_ID, id);
}
Log.d("Cursor", "SaveIntent");
setResult(Activity.RESULT_OK, data);
Log.d("Cursor", "SetResult");
onBackPressed();
Log.d("Cursor", "backPressed");
}
...
}
我尝试将onBackPressed() 替换为finish(),但这也无济于事。
出现的唯一日志消息是SaveIntent、SetResult 和backPressed。 OnActivityResult 和 OnActivityResultOk 仅出现在其工作的设备上。
谁能帮我确定为什么会出现这个问题以及如何解决它?
【问题讨论】:
-
如果您返回的片段不是正确的片段,那么这听起来像是您的第一个活动的问题,而不是活动结果 API 的问题。你的第一个活动是做什么的?
-
如果您指的是片段打开的活动,那么,该活动允许您在屏幕上编辑一些参数(editText、Spinner 等)。按下保存按钮后,将创建一个 android.content.Intent 并将其与屏幕上的选定值一起传回。
-
不,first 活动 - 您将结果返回到的活动。
-
哦,好的。底部导航栏包含三个选项卡。显示的片段是第一个选项卡,但在底部导航栏中,中间选项卡显示为选中(突出显示)。中间选项卡是我希望活动返回的位置。中间选项卡显示了我的 Intent 对象的回收器视图列表。第一个选项卡本身具有三个选项卡视图(屏幕顶部),每个选项卡都显示了 Intent 对象选择的回收器视图列表。
-
因为我在一个片段中,所以我在片段类中的 onCreateView 中添加了所有代码。然后,一切都完成后,我返回了视图。是否会因为 onClickListener 在我返回视图之前启动新活动而发生此问题?
标签: java android android-studio android-fragments android-intent