gpt4 book ai didi

android - 索尼 xperia 的 onActivityResult 问题

转载 作者:行者123 更新时间:2023-11-30 02:11:57 30 4
gpt4 key购买 nike

我开始 Activity 以打开 GPS然后收到 OnACtivityResult .. 它在某些手机上工作正常,但索尼不工作,我不知道为什么我使用嵌套 fragment 开始 Activity

Intent callGPSSettingIntent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(
callGPSSettingIntent, openGPSRequest);

然后 fragment 接收

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == openGPSRequest) {
try {
activity.hideProgress();
} catch (Exception e) {

}
activity.replaceCurrentFragment(
FramentNavigationMapInside.getInstance(branche), true, true);
}
}

在主要 Activity 中

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

super.onActivityResult(requestCode, resultCode, data);



}

并在每个 fragment 中覆盖 onActivityResult

我在 lenove 和 samsung 上测试它并且工作正常,但是在 sony xperia 上不起作用,只有在主要 Activity 调用中的 onActivityResult

最佳答案

解决我的问题

我们在Fragment的世界中经常遇到的一个常见问题是:虽然我们可以直接从Nested Fragment调用startActivityForResult,但似乎永远不会调用onActivityResult,这给处理Nested Fragment的Activity Result带来了很多麻烦。

解决方案

因此,从现在开始,我们将从 Fragment 调用 getActivity().startActivityForResult(...),而不仅仅是 startActivityResult(...)。像这样:

// In Fragment
Intent intent = new Intent(getActivity(), SecondActivity.class);
getActivity().startActivityForResult(intent, 12345);

因此,所有收到的结果都将在一个地方处理:放置 Fragment 的 Activity 的 onActivityResult。

问题是如何将Activity Result发送到Fragment?由于我们无法以正常方式或至少以简单方式直接与所有嵌套 fragment 通信。另一个事实是,每个 fragment 都知道它必须处理哪个 requestCode,因为它也是调用 startActivityForResult 的那个。所以我们选择“广播到每个在某个时间处于 Activity 状态的 fragment 。让这些 fragment 检查请求代码并做他们想做的事情。”

关于广播,LocalBroadcastManager 可以胜任这项工作,但机制太老了。我选择了另一种选择,即 EventBus,它有很多选择。我选择的是来自广场的奥托。它在性能和稳健性方面非常出色。

dependencies {
compile 'com.squareup:otto:1.3.6'
}

以 Otto 的方式,让我们创建一个总线事件作为一个包含这些 Activity 结果值的包。

import android.content.Intent;

/**
* Created by nuuneoi on 3/12/2015.
*/
public class ActivityResultEvent {

private int requestCode;
private int resultCode;
private Intent data;

public ActivityResultEvent(int requestCode, int resultCode, Intent data) {
this.requestCode = requestCode;
this.resultCode = resultCode;
this.data = data;
}

public int getRequestCode() {
return requestCode;
}

public void setRequestCode(int requestCode) {
this.requestCode = requestCode;
}

public int getResultCode() {
return resultCode;
}

public void setResultCode(int resultCode) {
this.resultCode = resultCode;
}

public Intent getData() {
return data;
}

public void setData(Intent data) {
this.data = data;
}
}

import android.os.Handler;
import android.os.Looper;

import com.squareup.otto.Bus;

/**
* Created by nuuneoi on 3/12/2015.
*/
public class ActivityResultBus extends Bus {

private static ActivityResultBus instance;

public static ActivityResultBus getInstance() {
if (instance == null)
instance = new ActivityResultBus();
return instance;
}

private Handler mHandler = new Handler(Looper.getMainLooper());

public void postQueue(final Object obj) {
mHandler.post(new Runnable() {
@Override
public void run() {
ActivityResultBus.getInstance().post(obj);
}
});
}

}

在 Activity 中

public class MainActivity extends ActionBarActivity {

...

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ActivityResultBus.getInstance().postQueue(
new ActivityResultEvent(requestCode, resultCode, data));
}

...

}

最后处理 fragment 中的ActivityResult数据

public class BodyFragment extends Fragment {

...

@Override
public void onStart() {
super.onStart();
ActivityResultBus.getInstance().register(mActivityResultSubscriber);
}

@Override
public void onStop() {
super.onStop();
ActivityResultBus.getInstance().unregister(mActivityResultSubscriber);
}

private Object mActivityResultSubscriber = new Object() {
@Subscribe
public void onActivityResultReceived(ActivityResultEvent event) {
int requestCode = event.getRequestCode();
int resultCode = event.getResultCode();
Intent data = event.getData();
onActivityResult(requestCode, resultCode, data);
}
};
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Don't forget to check requestCode before continuing your job
if (requestCode == 12345) {
// Do your job
tvResult.setText("Result Code = " + resultCode);
}
}
...

}

希望这段代码能帮助任何人面对这个问题

关于android - 索尼 xperia 的 onActivityResult 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972653/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com