2015-04-30 41 views
1

我对结果打开GPS 然后在OnACtivityResult收到启动活动。它是在一些手机做工精细,但与索尼不行,我不知道为什么我 使用嵌套的片段 开始活动问题onActivityResult与索尼XPERIA

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

然后接收在片段

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

在主活性

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

super.onActivityResult(requestCode, resultCode, data); 



    } 

,并在每个片段覆盖onActivityResult

,我测试它在lenove和三星,做工精细,,但索尼XPERIA不行,只有onActivityResult这主要活动通话

+0

我认为这是要去是支持索尼的问题... – Yurets

回答

1

解决我的问题通过

我们在碎片世界总是遇到的一个常见问题是:尽管我们可以直接从Nested Fragment调用startActivityForResult,但它似乎永远不会调用onActivityResult,这会带来很多麻烦来处理来自嵌套的Activity结果神父agment。

解决

所以我们从现在起将调用getActivity()。从片段,而不是仅仅startActivityResult(...)startActivityForResult(...)。像这样:

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

其结果是,所有接收到的将在一个地方进行处理的结果的:该片段被放置在活动的onActivityResult。

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

谈论广播,LocalBroadcastManager可以完成这项工作,但机械师太老了。我选择另一个选择,一个EventBus,它有很多选择。我选择的那个是来自广场的奥托。它在性能和稳健性方面非常出色。

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

以Otto的方式,我们创建一个总线事件作为一个包带有这些活动结果值。

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

} 

而且在活动

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

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

} 

希望这个代码帮助任何一个面对这个问题