java - 旋转器未在旋转时保存所选项目

标签 java android spinner

我试图让我的微调器在屏幕转动时保存其位置。我尝试遵循解决方案 here ,但是它不起作用并给了我一个空指针异常。有什么解决办法吗?

package tk.talcharnes.popularmovies;

import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.Spinner;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * A placeholder fragment containing a simple view.
 */
public class PostersFragment extends Fragment {
    private static List<MovieModel> movieModelList;
    private static int movieModelListLength;
    GridView gridView;
    ImageAdapter adapter;
    Spinner spinner;
    private String sort_method;
    public PostersFragment() {
        //sort_method = "popularity.desc";
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

            updatePosters();
        // should find gridview on the view which you are creating
        gridView = (GridView) view.findViewById(R.id.gridview);



         DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int width = (int) (displayMetrics.widthPixels / displayMetrics.density);
//
//        //For Tabs
////        boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
////        width = isLandscape ? (width / 2) : width;
//        int numcolumns =(int) (width/(185));
////
////        float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
////        float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
////        int numcolumns = (int)((185*dp)/dpWidth);
//        gridView.setNumColumns(numcolumns);
        if (getResources().getConfiguration().orientation
                == 1) {
            gridView.setNumColumns(2);


        } else if ( getResources().getConfiguration().orientation
                == 2) {
            gridView.setNumColumns(3);

        }

        adapter = new ImageAdapter(getContext());
        gridView.setAdapter(adapter);
        updatePosters();
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                                    int position, long id) {
                Toast.makeText(getContext(), "You clicked " + movieModelList.get(position).getTitle(),
                        Toast.LENGTH_SHORT).show();
                MovieModel movieModel = movieModelList.get(position);
                Intent intent = new Intent(getActivity(), MovieDetails.class);
                intent.putExtra("Movie_number", position);
                startActivity(intent);

            }
        });
        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("spinner", spinner.getSelectedItemPosition());
    }

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

        if(savedInstanceState != null) {
            spinner.setSelection(savedInstanceState.getInt("spinner", 0));
        }
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        //commented out until a settings menu is implemented
      //  super.onCreateOptionsMenu(menu, inflater);
      //  getActivity().getMenuInflater().inflate(R.menu.menu_main, menu);
        inflater.inflate(R.menu.menu_refresh, menu);


        MenuItem item = menu.findItem(R.id.spinnerr);
         spinner = (Spinner) MenuItemCompat.getActionView(item);


        String[] sortingCriteria = {"Popular", "Highest Rated"};
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner, sortingCriteria);
        spinner.setAdapter(spinnerAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
                if(position == 0){
                    sort_method = "popularity.desc";
                    updatePosters();
                }
                else if (position == 1){
                    sort_method = "vote_average.desc";
                    updatePosters();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parentView) {
                // does nothing
            }

        });

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        //noinspection SimplifiableIfStatement

        if (id == R.id.action_refresh) {
            Toast.makeText(getActivity(), "Refreshing",
                    Toast.LENGTH_SHORT).show();

           updatePosters();
            gridView.setAdapter(adapter);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    public void updatePosters(){
        FetchPostersTask updatePosters = new FetchPostersTask();
        updatePosters.execute();
    }









    //Get movie posters and data
    public class FetchPostersTask extends AsyncTask<Void,Void,Void> {
        private final String LOG_TAG = FetchPostersTask.class.getSimpleName();
        //will contain raw Json data
        String posterJsonString = null;

        public Void parseMovieJson()
                throws JSONException{
            JSONObject jsonParentObject = new JSONObject(posterJsonString);
            JSONArray movieJSonArray = jsonParentObject.getJSONArray("results");

            movieModelList = new ArrayList<>();
            for(int i = 0; i < movieJSonArray.length(); i++){
                JSONObject movieJsonObject = movieJSonArray.getJSONObject(i);
                MovieModel movieModel = new MovieModel();
                movieModel.setTitle(movieJsonObject.getString("title"));
                movieModel.setOverview(movieJsonObject.getString("overview"));
                movieModel.setPoster_path(movieJsonObject.getString("poster_path"));
                movieModel.setRelease_date(movieJsonObject.getString("release_date"));
                movieModel.setVote_average(movieJsonObject.getString("vote_average"));
                movieModelListLength++;

                movieModelList.add(movieModel);
            }
            return null;
        }

        @Override
        protected Void doInBackground(Void ...params) {

            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;

            //will contain raw Json data
            try{

                //open connection to api

                final String BASE_URL = "https://api.themoviedb.org/3/discover/movie?";
                final String SORT_PARAM ="sort_by";



                Uri builtUri = Uri.parse(BASE_URL).buildUpon()
                        .appendQueryParameter(SORT_PARAM, sort_method)
                        .appendQueryParameter("api_key", BuildConfig.MOVIE_DB_API_KEY).build();

                URL url = new URL(builtUri.toString());
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                //read input into string
                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();
                if(inputStream == null){
                    //nothing else to do in this case
                    return null;
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                while((line = reader.readLine())!= null){
                    buffer.append(line + "\n");
                }

                if(buffer.length()==0){
                    //nothing here, don't parse
                    return null;
                }

                posterJsonString = buffer.toString();
            }
            catch(MalformedURLException e){
                e.printStackTrace();
            }
            catch(IOException e){
                Log.e(LOG_TAG, "Error", e);
                return null;
            }
            finally {
                if(urlConnection != null){
                    urlConnection.disconnect();
                }
                if(reader != null){
                    try{
                        reader.close();

                    }
                    catch (final IOException e){
                        Log.e(LOG_TAG,"Error closing stream", e);
                    }
                }
            }
            try{
                parseMovieJson();;
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            String[] asc = new String[movieModelList.size()];
            for(int i = 0; i < asc.length; i++){
                asc[i]=(getMovieModelList().get(i).getPoster_path());

            }
            adapter.setImageArray(asc);
            adapter.notifyDataSetChanged();
        }
    }
    public static List<MovieModel> getMovieModelList(){
        return movieModelList;
    }
    public static int getMovieModelListLength(){
        return movieModelListLength;
    }

}

这是错误代码:

FATAL EXCEPTION: main
                                                                             Process: tk.talcharnes.popularmovies, PID: 16847
                                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{tk.talcharnes.popularmovies/tk.talcharnes.popularmovies.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setSelection(int)' on a null object reference
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
                                                                                 at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3945)
                                                                                 at android.app.ActivityThread.access$900(ActivityThread.java:149)
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                 at android.os.Looper.loop(Looper.java:135)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5290)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
                                                                              Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setSelection(int)' on a null object reference
                                                                                 at tk.talcharnes.popularmovies.PostersFragment.onCreate(PostersFragment.java:115)
                                                                                 at android.support.v4.app.Fragment.performCreate(Fragment.java:1939)
                                                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1029)
                                                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230)
                                                                                 at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2037)
                                                                                 at android.support.v4.app.FragmentController.dispatchCreate(FragmentController.java:154)
                                                                                 at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:289)
                                                                                 at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:61)
                                                                                 at tk.talcharnes.popularmovies.MainActivity.onCreate(MainActivity.java:13)
                                                                                 at android.app.Activity.performCreate(Activity.java:6020)
                                                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366) 
                                                                                 at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3945) 
                                                                                 at android.app.ActivityThread.access$900(ActivityThread.java:149) 
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290) 
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                 at android.os.Looper.loop(Looper.java:135) 
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5290) 
                                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                                 at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) 
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) 

最佳答案

每当您的方向发生变化时,您的屏幕尺寸也会发生变化, 在您不想在旋转或大小更改时重新创建的 Activity 内的 AndroidManifest.xml 文件中添加以下行

android:configChanges="orientation|screenSize"

这样您的 Activity 就不会自动重新启动。请参阅documentation了解更多信息

android:configChanges

列出 Activity 将自行处理的配置更改。当运行时发生配置更改时,默认情况下 Activity 会关闭并重新启动,但声明具有此属性的配置将阻止 Activity 重新启动。相反,该 Activity 保持运行状态并调用其 onConfigurationChanged() 方法。

关于java - 旋转器未在旋转时保存所选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35767221/

相关文章:

iphone - iPad - iPhone 大 UIActivityIndi​​catorView

安卓微调器(下拉): How to know when its clicked (Expanded) and when an item is chosen?

java - 使用 Flink 时,字数统计数字总是在变化

android - Robotium waitForFragment

java - Java中静态字段什么时候初始化?

java - 将 boolean 值绑定(bind)到复选框 MVVM

android - OpenCV Android NDK 项目将无法构建

java - 更改依赖于 Spinner 行的 SQLite 查询

java - 将数组值设置为静态

java - 在数组中的字符串之间添加空格