簡體   English   中英

共享首選項未加載或保存

[英]sharedpreferences not loading or saving

當用戶在存儲的圖像網格的一部分中選擇他們想要的特定自定義圖像時,我嘗試使用sharedpreferences。 我希望他們選擇顯示的圖像即使在關閉應用程序並重新打開后也是如此。 我遇到的問題是sharedpreferences似乎不起作用。 他們關閉應用程序或什至只是按下“后退”按鈕后,所選的網格項目的背景圖像都不會顯示出來。

我必須自己創建一個sharedpreferences文件嗎? 我不知道如何使用androidstudio或如何創建它。

這是我的課程代碼(很抱歉,如果它又長又混亂,我是編碼和測試的新手):

  public class editCreations extends Activity {

    public int mPosition = 0;
    protected static Sounds sound = new Sounds();
    private static int RESULT_LOAD_IMAGE = 1;

    private MediaRecorder mRecorder;
    private MediaPlayer mPlayer;
    private String mOutputFile = Environment.getExternalStorageDirectory().getAbsolutePath();
    private Drawable mImageFileName;
    private Button recordBtn;
    private Button stopBtn;
    private Button playBtn;
    private Button stopPlayBtn;
    private ImageButton imgBtn;
    private Drawable bg;
    private  String mPicturePath;



    private ImageAdapter img = new ImageAdapter(this);





    View.OnClickListener playListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(editCreations.this, "test", Toast.LENGTH_SHORT);
        }
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create);

        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mRecorder.setOutputFile(mOutputFile);

        recordBtn = (Button)findViewById(R.id.create_record_button);
        recordBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start(view);
            }
        });

        stopBtn = (Button)findViewById(R.id.create_stop_record_button);
        stopBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stop(view);
            }
        });

        playBtn = (Button)findViewById(R.id.create_play_button);
        playBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                play(view);
            }
        });

        stopPlayBtn = (Button)findViewById(R.id.create_stop_button);
        stopPlayBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stopPlay(view);
            }
        });

        imgBtn = (ImageButton)findViewById(R.id.imageButton);

        Intent extra = getIntent();
        Bundle extras = extra.getExtras();

        // gave mPosition a default int to debug and find problem -> found it
        mPosition = extras.getInt("position");
        getSelectedFile(mPosition);

        imgBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(
                        Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                startActivityForResult(i, RESULT_LOAD_IMAGE);
            }
        });




    }

    public void start (View view) {
        try {

            mRecorder.prepare();
            mRecorder.start();

        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        recordBtn.setEnabled(false);
        stopBtn.setEnabled(true);

        Toast.makeText(editCreations.this, mPosition + "!", Toast.LENGTH_SHORT).show();

    }

    public void stop(View view){
        try {
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;

            stopBtn.setEnabled(false);
            recordBtn.setEnabled(true);

            Toast.makeText(getApplicationContext(), "Stop recording...",
                    Toast.LENGTH_SHORT).show();

        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }

    public void play(View view) {
        try{
            mPlayer = new MediaPlayer();
            mPlayer.setDataSource(mOutputFile);
            mPlayer.prepare();
            mPlayer.start();

            playBtn.setEnabled(false);
            stopPlayBtn.setEnabled(true);

            Toast.makeText(getApplicationContext(), "Start play the recording...",
                    Toast.LENGTH_SHORT).show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void stopPlay(View view) {
        try {
            if (mPlayer != null) {
                mPlayer.stop();
                mPlayer.release();
                mPlayer = null;
                playBtn.setEnabled(true);
                stopPlayBtn.setEnabled(false);

                Toast.makeText(getApplicationContext(), "Stop playing the recording...",
                        Toast.LENGTH_SHORT).show();


            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public void getSoundPosition(int position) {
        mOutputFile = mOutputFile + "/Lollatone_clip_" + mPosition + ".3gpp";

        // use to get proper image and sound files and edit output file to proper name
    }

    public void getSelectedFile(int position) {
            switch (mPosition) {
                case 0:
                    imgBtn.setBackgroundResource(R.drawable.sample_0);
                    imgBtn.refreshDrawableState();
                    break;
                case 1:
                    imgBtn.setImageBitmap(BitmapFactory.decodeFile(mPicturePath));
                    imgBtn.refreshDrawableState();
                    break;
                case 2:
                    imgBtn.setImageBitmap(BitmapFactory.decodeFile(mPicturePath));
                    imgBtn.refreshDrawableState();
                    break;
                case 3:
                    imgBtn.setImageBitmap(BitmapFactory.decodeFile(mPicturePath));
                    imgBtn.refreshDrawableState();
                    break;
                case 4:
                    imgBtn.setBackgroundResource(R.drawable.sample_4);
                    imgBtn.refreshDrawableState();
                    break;
            }

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.edit_creations, 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();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode,resultCode,data);

       if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
           Uri selectedImage = data.getData();
           String[] filePathColumn = { MediaStore.Images.Media.DATA};

           Cursor cursor = getContentResolver().query(selectedImage,
                   filePathColumn, null,null,null);
           cursor.moveToFirst();

           int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
           mPicturePath = cursor.getString(columnIndex);
           cursor.close();

           imgBtn.setImageBitmap(BitmapFactory.decodeFile(mPicturePath));

           imgBtn.refreshDrawableState();
           // String picturePath contains the path of
           // selected image
       }
   }

    protected void onPause() {
        super.onPause();

        //need an editor object to make preference changes
        // all objects are from android.context.Context
        SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString("img_" + mPosition, mPicturePath);

        editor.commit();
    }

    protected void onResume() {
        super.onResume();
        SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
        mPicturePath = sharedPref.getString("img_" + mPosition, "img_" + mPosition);
    }
}

您正確使用了SharedPreferences ,但是沒有將代碼放入正確的活動生命周期方法中。 您正在閱讀onCreate()上的首選項並保存在onStop()因此也許您可以將其保存在onPause() (以確保早些保存),然后重新加載onResume()而不是onCreate() (后者僅在活動的生命周期中發生一次)。

另外,您可能希望檢查Context.getSharedPreferences()是否是一個更好的選擇,因為它在多個活動之間共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM