ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)
Posted
技术标签:
【中文标题】ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)【英文标题】:ActivityResultCallback function onActivityResult won't be triggered on some devices (Android Studio / Java) 【发布时间】: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 在我返回视图之前启动新活动而发生此问题? 【参考方案1】:使用日志消息,我意识到每次都在重新创建活动/片段。然后我想检查我的开发人员选项,看看是否启用了“不保留活动”。事实证明确实如此。切换后,它又开始工作了!
【讨论】:
以上是关于ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)的主要内容,如果未能解决你的问题,请参考以下文章
损失函数(损失函数代价函数目标函数)MSE0-1损失函数绝对误差损失函数分位数损失函数Huber损失函数感知损失函数Hinge损失函数指数损失函数对数损失函数
Kotlin函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
8InfluxDB常用函数聚合函数,count()函数,DISTINCT()函数,MEAN()函数,MEDIAN()函数,SPREAD()函数,SUM()函数
Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )
Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )