片段的一半生命周期方法在旋转后不会被调用

时间:2015-09-04 10:22:45

标签: android android-fragments

每次旋转屏幕时,我都会遇到片段生命周期的奇怪行为。只有前半部分的生命周期方法被调用,onPauseonSaveInstanceStateonStoponDestroyViewonDestroyonDetach。另一半(onAttach ...- onResume)没有被调用。与Fragment相关联的Activity调用其所有生命周期方法。 任何帮助都将受到高度赞赏,因为我坚持这个问题。 提前谢谢。

这里是Activity的整个代码和静态嵌套类,其中是Fragment:

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

屏幕截图,旋转前后。

在: Before

在: After

日志enter image description here

0 个答案:

没有答案