繁体   English   中英

startActivityForResult之后的Android旋转

[英]Android rotation after startActivityForResult

我有2个活动, MainActivity (包含MainFragment )和SearchActivity

当用户单击MainActivity的搜索按钮时,我使用startActivityForResult()打开SearchActivity 然后,用户输入他们的查询,然后将该查询作为结果返回给MainActivity ,在这里我有一个searcher对象,该对象实际上对该查询执行搜索。

但是,在以下情况下我遇到了问题:我在MainActivity ,然后单击搜索按钮。 我转到SearchActivity ,继续旋转手机。 我键入查询,然后返回MainActivity ,由于searcher为null导致崩溃。

所以,我明白,当我旋转屏幕MainActivity是越来越破坏并重新创建,和我节省了实例的状态,我遇到的问题是onActivityResult()是越来越之前调用onActivityCreated()MainFragment 在处理结果之前,如何确保MainFragment恢复到以前的状态?

编辑:

这是我的代码(经过大量编辑;适用于工作)。

主要活动

public class MainActivity extends AppCompatActivity {
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mainFragment = getSupportFragmentManager().getFragment(savedInstanceState, "fragment");
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, "fragment", mainFragment);
    }
}

主要片段

public class MainFragment extends Fragment {
    private Searcher searcher;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        searcher = new Searcher();

        if (savedInstanceState != null) {
            // restore state
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (resultCode == Activity.RESULT_OK) {
             if (data.hasExtra("query")) {                
                 String query = data.getStringExtra("query");
                 searcher.search(query);
             }
         }
     }

     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         // save state
     }
}

例如,当我在使用WebView时遇到麻烦时,可以这样做:

@Override
protected void onSaveInstanceState(Bundle outState ) {
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState); //Do your own action
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    mWebView.restoreState(savedInstanceState); // Do your own action
}

这可能有助于崩溃:

    if (savedInstanceState == null)
    {
        mWebView.loadUrl("https://goo.gl/6wE4Di"); //do your own action
    }

android:configChanges="orientation|screenSize"

在Android Manifest中的MainActivity标签中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM