0

嗨,我正在开发使用 Sherlock 操作栏的小型 android 应用程序。我的应用程序包含以下内容。一项主要活动,其中包含 2 个片段和一项示例活动。所以我想要在片段内单击按钮开始新的示例活动。我正在为结果开始样本活动。在活动结果上,我想要将选项卡交换到另一个选项卡的 Tab2。我以下列方式做到了这一点

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(getSherlockActivity(), "click on button", Toast.LENGTH_SHORT).show();
    //getActivity().getActionBar().setSelectedNavigationItem(1);
    Intent intent = new Intent(getActivity(), SampleActivity.class);
    startActivityForResult(intent, 7);
}

以及我想要做的活动结果

 @Override @SuppressLint("NewApi")
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 7)
    {
            getSherlockActivity().getSupportActionBar().setSelectedNavigationItem(1);
    }
}

因此,当我尝试这样做时getSherlockActivity().getSupportActionBar().setSelectedNavigationItem(1); ,会显示以下错误:

08-08 16:05:21.596: E/AndroidRuntime(6885): FATAL EXCEPTION: main
08-08 16:05:21.596: E/AndroidRuntime(6885): java.lang.RuntimeException: Failure        delivering result ResultInfo{who=null, request=65543, result=0, data=null} to activity {com.example.sampletabapp/com.example.sampletabapp.MainActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

任何对此有解决方案的人。需要帮助谢谢。

这是有关此问题的示例项目https://www.dropbox.com/s/0d61i9ccol189tv/SampleTabAppZIP.tar.gz。你可以检查什么是实际问题。任何对此有解决方案的人请帮忙。谢谢你。

4

1 回答 1

0

为避免在生命周期方法期间与 UI 线程上的立即执行发生冲突,您可以使用各种 post() 方法或实现自己的Handler

我更喜欢 Handler 模式。

我建议将您的 Handler 声明为私有静态内部类,并让它持有WeakRefence它要操作的任何内容,很可能是片段。如果片段在其生命周期方法中反复运行,弱引用将有助于避免内存泄漏。

private static MyHandler extends Handler {
    private final WeakReference<MyFragment> ref;

    public MyHandler(MyFragment fragment) {
        ref = new WeakReference<MyFragment>(fragment);
    }

    @Override
    public void handleMessage(Message message) {
        MyFragment fragment = ref.get();
        if (fragment != null) {
            //do whatever you want to do.
            //For example:
            fragment.someCallbackMethod();
        }
    }
}

然后在您的片段中,您所要做的就是在onClick()方法内向您的处理程序发送一条消息

@Override
public void OnClick(View v) {
    handler.sendMessage(new Message());
}
于 2013-08-08T14:36:53.463 回答