Java 旋转屏幕后保留碎片

Java 旋转屏幕后保留碎片,java,android,android-fragments,screen-orientation,Java,Android,Android Fragments,Screen Orientation,我想stackoverflow已经有很多这样的话题了,但我还是不明白 问题是,当屏幕旋转且互联网处于非活动状态时,我希望保留片段及其数据 因此,情况是: 加载主要活动 关掉互联网 旋转屏幕 检查数据是否仍然存在 我的代码的问题是,当用户旋转屏幕并且internet处于非活动状态时,它将不会加载,因为我知道它将在视图模型中调用setShow(),这将影响API 我不允许使用android:configChange或setRetainInstance之类的东西。只有 类似于onSaveInstanc

我想stackoverflow已经有很多这样的话题了,但我还是不明白

问题是,当屏幕旋转且互联网处于非活动状态时,我希望保留片段及其数据

因此,情况是:

  • 加载主要活动
  • 关掉互联网
  • 旋转屏幕
  • 检查数据是否仍然存在
  • 我的代码的问题是,当用户旋转屏幕并且internet处于非活动状态时,它将不会加载,因为我知道它将在视图模型中调用setShow(),这将影响API

    我不允许使用android:configChange或setRetainInstance之类的东西。只有 类似于onSaveInstanceState的东西

    下面是我的MainActivity.java:

    公共类MainActivity扩展AppCompative实现BottomNavigationView.OnNavigationItemSelectedListener{
    私有内容;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    BottomNavigationView导航=findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(此);
    如果(savedInstanceState==null){
    navigation.setSelectedItemId(R.id.navigation\U电影);
    }否则{
    pageContent=getSupportFragmentManager().getFragment(savedInstanceState,“片段”);
    loadFragment(pageContent);
    }
    }
    @凌驾
    公共布尔值onNavigationItemSelected(@NonNull MenuItem MenuItem){
    片段=空;
    开关(menuItem.getItemId()){
    案例R.id.navigation\u电影:
    Bundle movieBundle=新Bundle();
    movieBundle.putBoolean(“isFavorite”,false);
    fragment=新电影片段();
    fragment.setArguments(movieBundle);
    页面内容=片段;
    打破
    案例R.id.navigation\U电视节目:
    Bundle tvBundle=新Bundle();
    putbulen(“isFavorite”,false);
    fragment=新的TvShowFragment();
    fragment.setArguments(tvBundle);
    页面内容=片段;
    打破
    }
    返回loadFragment(fragment);
    }
    @凌驾
    SaveInstanceState上受保护的无效(束超出状态){
    super.onSaveInstanceState(超出状态);
    getSupportFragmentManager()
    .putFragment(突出显示,“片段”,页面内容);
    }
    私有布尔加载片段(片段片段){
    if(片段!=null){
    getSupportFragmentManager()
    .beginTransaction()
    .更换(R.id.frame_容器,碎片)
    .commit();
    返回true;
    }
    返回false;
    }
    }
    
    java(与TvShowFragment相同)

    公共类电影片段扩展片段{
    专用显示适配器;
    私人ProgressBar ProgressBar;
    私有ShowViewModel ShowViewModel;
    私人亲友帮手亲友帮手;
    私人布尔值是最受欢迎的;
    公共电影片段(){
    }
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    如果(getActivity()!=null){
    showViewModel=ViewModelProviders.of(getActivity()).get(showViewModel.class);
    showViewModel.getShows().observe(这个,getShow);
    }
    }
    私有观察者getShow=新观察者(){
    @凌驾
    更改后的公共void(ArrayList显示){
    如果(显示!=null){
    adapter.setData(显示);
    显示加载(假);
    }
    }
    };
    @凌驾
    创建视图上的公共视图(布局、充气机、视图组容器、,
    Bundle savedInstanceState){
    Bundle=getArguments();
    this.isFavorite=bundle.getBoolean(“isFavorite”);
    返回充气机。充气(R.layout.fragment_show,容器,假);
    }
    @凌驾
    已创建公用void onview(@NonNull视图,Bundle savedInstanceState){
    super.onViewCreated(视图,savedInstanceState);
    progressBar=view.findViewById(R.id.progressBar);
    显示加载(真);
    适配器=新的ShowAdapter();
    adapter.notifyDataSetChanged();
    favoriteHelper=favoriteHelper.getInstance(getActivity());
    RecyclerView RecyclerView=view.findViewById(R.id.rv_show);
    setLayoutManager(新的LinearLayoutManager(getContext());
    recyclerView.setAdapter(适配器);
    showViewModel.setShows(“电影”);
    }
    私有void显示加载(布尔状态){
    如果(州){
    progressBar.setVisibility(View.VISIBLE);
    }否则{
    progressBar.setVisibility(View.GONE);
    }
    }
    }
    
    和ShowViewModel.java

    公共类ShowViewModel扩展了ViewModel{
    私有静态最终字符串API_KEY=“API_KEY”;
    私有MutableLiveData listShows=新的MutableLiveData();
    私有AsyncHttpClient=新的AsyncHttpClient();
    private ArrayList listItems=new ArrayList();
    私人表演;
    公共无效设置显示(最终字符串类型){
    listItems.clear();
    字符串url=String.format(“https://api.themoviedb.org/3/discover/%s?api_key=%s&language=en-美国”,类型,API_键);
    get(url,新的AsyncHttpResponseHandler(){
    @凌驾
    成功时的公共void(int statusCode,Header[]headers,byte[]responseBody){
    试一试{
    字符串结果=新字符串(responseBody);
    JSONObject responseObject=新JSONObject(结果);
    JSONArray结果=responseObject.getJSONArray(“结果”);
    对于(int i=0;ipublic class BaseActivity extends AppCompatActivity {
    
    protected Bundle savedInstanceState;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.savedInstanceState = savedInstanceState;
    }
    
    public class MainActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener {
    
    private Fragment pageContent;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        BottomNavigationView navigation = findViewById(R.id.navigation);
    
        navigation.setOnNavigationItemSelectedListener(this);
    
        if (savedInstanceState != null) {
            pageContent = getSupportFragmentManager().getFragment(savedInstanceState, "fragment");
        }
        else {
            // load your fragment..
        }
    
    }
    
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        Fragment fragment = null;
    
        switch (menuItem.getItemId()) {
            case R.id.navigation_movies:
                Bundle movieBundle = new Bundle();
                movieBundle.putBoolean("isFavorite", false);
                fragment = new MovieFragment();
                fragment.setArguments(movieBundle);
                pageContent = fragment;
                break;
            case R.id.navigation_tvshow:
                Bundle tvBundle = new Bundle();
                tvBundle.putBoolean("isFavorite", false);
                fragment = new TvShowFragment();
                fragment.setArguments(tvBundle);
                pageContent = fragment;
                break;
        }
        return loadFragment(fragment);
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager()
                .putFragment(outState, "fragment", pageContent);
    }
    
    private boolean loadFragment(Fragment fragment) {
        if (fragment != null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.frame_container, fragment)
                    .commit();
            return true;
        }
    
        return false;
    }