Android 片段的一半生命周期方法在旋转后未被调用
每次旋转屏幕时,我都会经历一种奇怪的碎片生命周期行为。只调用生命周期的前半部分方法,Android 片段的一半生命周期方法在旋转后未被调用,android,android-fragments,Android,Android Fragments,每次旋转屏幕时,我都会经历一种奇怪的碎片生命周期行为。只调用生命周期的前半部分方法,onPause,onSaveInstanceState,onStop,onDestroyView,onDestroy和onDetach。另一半(onAttach…-onResume)没有接到电话。与片段关联的活动正在调用其所有生命周期方法。 任何帮助都将不胜感激,因为我被困在这个问题上。 提前谢谢 这里是活动和静态嵌套类的完整代码,其中是片段: public class MoviesFeed extends Ap
onPause
,onSaveInstanceState
,onStop
,onDestroyView
,onDestroy
和onDetach
。另一半(onAttach…-onResume)没有接到电话。与片段关联的活动正在调用其所有生命周期方法。
任何帮助都将不胜感激,因为我被困在这个问题上。
提前谢谢
这里是活动和静态嵌套类的完整代码,其中是片段:
public class MoviesFeed extends AppCompatActivity {
private static boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("ACT","onCreate");
setContentView(R.layout.themoviedb_main);
if(findViewById(R.id.detail_activity_container)!=null) {
//the detail_activity_container will be present only in large-screen
//Layouts (res/Layout-sw600dp. If this view is present, then the activity
//should be in two-pane mode
mTwoPane=true;
//In two-pane mode, show the detail view in this activity by adding
// or replacing the detail fragment using a fragment transaction
DetailActivityFragment detailActivityFragment=new DetailActivityFragment();
// Bundle bundle=new Bundle();
// bundle.putBoolean("twopane",mTwoPane);
// detailActivityFragment.setArguments(bundle);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.detail_activity_container, detailActivityFragment)
.commit();
}
} else {
mTwoPane=false;
}
}
@Override
protected void onStart() {
Log.d("ACT","onStart");
super.onStart();
}
@Override
protected void onResume() {
Log.d("ACT","onResume");
super.onResume();
}
@Override
protected void onPause() {
Log.d("ACT","onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.d("ACT","onStop");
super.onStop();
}
@Override
protected void onRestart() {
Log.d("ACT","onRestart");
super.onRestart();
}
@Override
protected void onDestroy() {
Log.d("ACT","onDestroy");
super.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.movies_feed_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
startActivity(new Intent(this,SettingsActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
public static class MoviesFeedFragment extends Fragment implements AdapterView.OnItemClickListener {
private static final int APPROX_FIXED_IMAGE_WIDTH=170;
private GridView mGridView;
private MovieAdapter mMovieAdapter;
private ArrayList<Response.Movie> mListMovies=new ArrayList<Response.Movie>();
private TimeMeasure mTm;
private boolean mFromDetailsActivity =false;
private boolean mUserRotation=false;
private boolean mFavoritesMode=false;
@Override
public void onAttach(Activity activity) {
Log.d("FRAG", "onAttach");
super.onAttach(activity);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FRAG", "onCreate");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.fragment_moviesfeed, container, false);
Log.d("FRAG", "onCreateView");
mGridView= (GridView) view.findViewById(R.id.gridView);
mGridView.setOnItemClickListener(this);
mMovieAdapter = new MovieAdapter(getActivity(), mListMovies);
mGridView.setAdapter(mMovieAdapter);
//for tablets specially
// float scalefactor = getResources().getDisplayMetrics().density * APPROX_FIXED_IMAGE_WIDTH;
// Point size=new Point();
// getWindowManager().getDefaultDisplay().getSize(size);
// int number=size.x;
// int columns = (int) ((float) number / (float) scalefactor);
//
// mGridView.setNumColumns(columns);
if(savedInstanceState!=null){
mUserRotation=true;
ArrayList<Response.Movie> tempList=new ArrayList<Response.Movie>();
tempList=savedInstanceState.getParcelableArrayList("mListMovies");
mListMovies.clear();
mListMovies.addAll(tempList);
mMovieAdapter = new MovieAdapter(getActivity(), mListMovies);
mGridView.setAdapter(mMovieAdapter);
}
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
Log.d("FRAG", "onActivity");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onPause() {
Log.d("FRAG", "onPause");
super.onPause();
}
@Override
public void onStop() {
Log.d("FRAG", "onStop");
super.onStop();
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.d("FRAG", "onSaveInstanceState");
super.onSaveInstanceState(outState);
outState.putParcelableArrayList("mListMovies", mListMovies);
}
@Override
public void onResume() {
Log.d("FRAG", "onResume");
super.onResume();
if (mFromDetailsActivity !=true && mUserRotation!=true) {
executeCallToMoviesApi();
} else if(mFromDetailsActivity==true && mFavoritesMode==true) {
getFavoritesMovies();
}
mFromDetailsActivity =false;
mUserRotation=false;
}
@Override
public void onDestroyView() {
Log.d("FRAG", "onDestroyView");
super.onDestroyView();
}
@Override
public void onDestroy() {
Log.d("FRAG", "onDestroy");
super.onDestroy();
}
@Override
public void onDetach() {
Log.d("FRAG", "onDetach");
super.onDetach();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mTwoPane==true) {
DetailActivityFragment detailActivityFragment=new DetailActivityFragment();
Bundle args=new Bundle();
args.putString("movieId", String.valueOf(mListMovies.get(position).getId()));
//Response.Movie movie=new Response.Movie();
//movie.setId(mListMovies.get(position).getId());
//args.putParcelable("movie",movie);
args.putBoolean("favoritesMode",mFavoritesMode);
detailActivityFragment.setArguments(args);
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.detail_activity_container,detailActivityFragment)
.commit();
} else {
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra("favoritesMode", mFavoritesMode);
intent.putExtra("movieId", mListMovies.get(position).getId());
mFromDetailsActivity = true;
startActivity(intent);
}
}
public void executeCallToMoviesApi(){
SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(getActivity());
String orderStr= sharedPreferences.getString(getString(R.string.pref_order_key),
getString(R.string.pref_order_default));
mFavoritesMode=false;
if (orderStr.equals(getString(R.string.pref_popularity))){
getActivity().setTitle(getString(R.string.mainactivity_title_popularity));
getMoviesByPopularity();
}
if (orderStr.equals(getString(R.string.pref_rate))){
getActivity().setTitle(getString(R.string.mainactivity_title_rate));
getMoviesByRate();
}
if (orderStr.equals(getString(R.string.pref_favorites))) {
getActivity().setTitle(getString(R.string.mainactivity_title_favorites));
mFavoritesMode=true;
getFavoritesMovies();
}
}
public void getMoviesByPopularity(){
ApiClient.MyApi myApi=ApiClient.getMyApiClient();
myApi.getMoviesByPopularityDesc(AppConstants.API_KEY, callbackResponse());
}
public void getMoviesByRate(){
ApiClient.MyApi myApi=ApiClient.getMyApiClient();
myApi.getMoviesByAverageRate(AppConstants.API_KEY, callbackResponse());
}
private Callback<Response> callbackResponse() {
return new Callback<Response>() {
@Override
public void success(Response response, retrofit.client.Response response2) {
// Message.displayToast(MoviesFeed.this, "success");
mListMovies.clear();
mListMovies.addAll((ArrayList) response.getResults());
mMovieAdapter = new MovieAdapter(getActivity(), mListMovies);
mGridView.setAdapter(mMovieAdapter);
}
@Override
public void failure(RetrofitError error) {
Log.v("VILLANUEVA", "error:" + error.getMessage().toString());
Message.displayToast(getActivity(), "failure" + error.getMessage().toString());
}
};
}
public void getFavoritesMovies(){
List<MovieDetail> tempListDetail;
ArrayList<Response.Movie> tempList=new ArrayList<Response.Movie>();
SharedPreferenceManager sharedPreferenceManager=new SharedPreferenceManager(getActivity());
tempListDetail = sharedPreferenceManager.getFavoritesList();
Response.Movie tempMovie;
if (tempListDetail!=null) {
for (MovieDetail movieDetail : tempListDetail) {
tempMovie = new Response.Movie();
tempMovie.setId(movieDetail.getId());
tempMovie.setPoster_path(movieDetail.getPoster_path());
tempList.add(tempMovie);
}
mListMovies.clear();
mListMovies.addAll(tempList);
}
mMovieAdapter = new MovieAdapter(getActivity(), mListMovies);
mGridView.setAdapter(mMovieAdapter);
}
}//MoviesFeedFragment
public class MoviesFeed扩展了appcompative活动{
私有静态布尔值窗格;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(“行为”、“创建”);
setContentView(右布局,移动b_主视图);
if(findViewById(R.id.detail\u activity\u container)!=null){
//详细信息\u活动\u容器将仅在大屏幕中显示
//布局(res/Layout-sw600dp。如果存在此视图,则活动
//应处于双窗格模式
mTwoPane=true;
//在双窗格模式下,通过添加
//或者使用片段事务替换细节片段
DetailActivityFragment DetailActivityFragment=新的DetailActivityFragment();
//Bundle=新Bundle();
//bundle.putBoolean(“twopane”,mTwoPane);
//detailActivityFragment.setArguments(bundle);
如果(savedInstanceState==null){
getSupportFragmentManager().beginTransaction()
.add(R.id.detail\u activity\u容器,detailActivityFragment)
.commit();
}
}否则{
mTwoPane=false;
}
}
@凌驾
受保护的void onStart(){
日志d(“行动”、“启动”);
super.onStart();
}
@凌驾
受保护的void onResume(){
日志d(“行动”、“恢复”);
super.onResume();
}
@凌驾
受保护的void onPause(){
日志d(“行动”、“暂停”);
super.onPause();
}
@凌驾
受保护的void onStop(){
Log.d(“ACT”、“onStop”);
super.onStop();
}
@凌驾
受保护的void onRestart(){
日志d(“行动”、“重新启动”);
super.onRestart();
}
@凌驾
受保护的空onDestroy(){
日志d(“ACT”、“onDestroy”);
super.ondestory();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.movies\u feed\u main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
startActivity(新意图(此,setingsActivity.class));
返回true;
}
返回super.onOptionsItemSelected(项目);
}
公共静态类MoviesFeedFragment扩展片段实现AdapterView.OnItemClickListener{
私有静态最终整数约为固定图像宽度=170;
私有网格视图mGridView;
私人电影适配器;
private ArrayList mListMovies=new ArrayList();
私人时间测量mTm;
私有布尔值mFromDetailsActivity=false;
私有布尔mUserRotation=false;
私有布尔值mFavoritesMode=false;
@凌驾
公共事务主任(活动){
日志d(“FRAG”、“onAttach”);
超级转速计(活动);
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(“FRAG”、“onCreate”);
}
@可空
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u moviesfeed,container,false);
Log.d(“FRAG”、“onCreateView”);
mGridView=(GridView)view.findviewbyd(R.id.GridView);
mGridView.setOnItemClickListener(此);
mMovieAdapter=新的电影适配器(getActivity(),mListMovies);
mGridView.setAdapter(mMovieAdapter);
//专门用于药片
//float scalefactor=getResources().getDisplayMetrics().density*近似固定图像宽度;
//点大小=新点();
//getWindowManager().getDefaultDisplay().getSize(大小);
//整数=大小.x;
//int列=(int)((float)number/(float)scalefactor);
//
//mGridView.setNumColumns(列);
如果(savedInstanceState!=null){
mUserRotation=true;
ArrayList tempList=新的ArrayList();
templast=savedInstanceState.getParcelableArrayList(“MLISMovies”);
mListMovies.clear();
mListMovies.addAll(圣殿骑士);
mMovieAdapter=新的电影适配器(getActivity(),mListMovies);
mGridView.setAdapter(mMovieAdapter);
}
返回视图;
}
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
日志d(“FRAG”、“onActivity”);
super.onActivityCreated(savedInstanceState);
}
@凌驾
公共无效暂停(){
日志d(“FRAG”、“onPause”);
super.onPause();