首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sony在onActivityResult中发行

sony在onActivityResult中发行
EN

Stack Overflow用户
提问于 2015-04-30 16:07:13
回答 1查看 379关注 0票数 1

我开始活动的结果打开全球定位系统,然后收到在OnACtivityResult ..。它在某些手机上工作很好,但是由于索尼不工作,我不知道为什么要使用嵌套的片段启动活动。

代码语言:javascript
复制
Intent callGPSSettingIntent = new Intent(
                                        android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                startActivityForResult(
                                        callGPSSettingIntent, openGPSRequest);

然后接收成碎片

代码语言:javascript
复制
@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);
        }
    }

主要活动

代码语言:javascript
复制
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);



    }

在每个片段中覆盖onActivityResult

并且我测试它在连理和三星和工作良好,但与索尼xperia不工作,只有onActivityResult,在主要活动称为

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-17 22:32:34

解决我的问题

在片段世界中,我们经常遇到的一个常见问题是:虽然我们可以从嵌套片段直接调用startActivityForResult,但是似乎从来没有调用过onActivityResult,这给处理嵌套片段所产生的活动带来了很多麻烦。

解决方案

因此,我们将调用getActivity().startActivityForResult(.)而不是只有startActivityResult(.)而今而后。如下所示:

代码语言:javascript
复制
// In Fragment
Intent intent = new Intent(getActivity(), SecondActivity.class);
getActivity().startActivityForResult(intent, 12345);

因此,接收到的所有结果都将在单个位置处理:放置片段的活动的onActivityResult。

问题是如何将活动结果发送到片段?因为我们无法以正常的方式直接与所有嵌套片段进行通信,或者至少是以简单的方式进行通信。另一个事实是,每个片段都知道它必须处理哪个requestCode,因为它也是调用startActivityForResult的那个片段。因此,我们选择了一种“向每个在时间上处于活动状态的片段广播”的方法,让这些片段检查requestCode并做他们想做的事情。

说到广播,LocalBroadcastManager可以做这项工作,但是机修工太老了。我选择了另一种选择,EventBus,它有很多选择。我选的是广场的奥托。它在性能和健壮性方面真的很好。

代码语言:javascript
复制
dependencies {
  compile 'com.squareup:otto:1.3.6'
}

以Otto的方式,让我们以包的形式创建一个Bus事件,其中包含这些活动结果值。

代码语言:javascript
复制
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);
            }
        });
    }

}

在活动中

代码语言:javascript
复制
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));
    }

    ...

}

最后,以片段形式处理回数据onActivityResult。

代码语言:javascript
复制
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);
        }
    }
    ...

}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29972653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档