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