2015-03-26 5 views
0

У меня есть макет к портрету и макет к пейзажу. В этой компоновке есть ImageView с прослушивателем onClick. У моего ImageView есть изображение по умолчанию (значок камеры) Когда я нажимаю ImageView, откройте диалоговое окно, и я могу открыть камеру, сделать снимок или открыть галерею и выбрать изображение. Затем я сохраняю растровое изображение и помещаю его в ImageView. Это растровое изображение является глобальной переменной в моем классе.Сохранить растровое изображение при изменении макета

Но когда я перехожу к своему приложению, загрузите другой макет (main_landscape), и если я возьму снимок, я потеряю растровое изображение и заряжу изображение по умолчанию.

Это мой код:

public void takePicture(View view) { 

    final CharSequence[] options = { "Take a pic", "Gallery","Cancel" }; 


    //Build an AlertDialog object 
    AlertDialog.Builder builder = new AlertDialog.Builder(Main.this); 
    builder.setTitle("Picture"); 

    //onClickListener method 
    builder.setItems(options, new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int selected) { 
      if(options[selected].equals("Take a pic")){ 
       //open camera 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg"); 
       //this is my global bitmap and I put it null when I push take a picture 
       resized=null; 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
       startActivityForResult(intent, 1); 
      } 
      else if(options[selected].equals("Gallery")){ 
       Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(intent, 2); 
      } 
      else{ 
       dialog.dismiss(); 
      } 
      //if user doesn't select anything, show default icon 
      //show picture is my layout ImageView and cameraicon is my default icon 
      showPicture.setImageResource(R.drawable.cameraicon); 
     } 
    }); 
    builder.show(); 
} 

Это мой onActivityResult код:

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


    //if my resultCode is RESULT_OK 
    if(resultCode == RESULT_OK){ 
     if(requestCode==1){ 
      File f = new File(Environment.getExternalStorageDirectory().toString()); 
      for(File temp: f.listFiles()){ 
       if(temp.getName().equals("temp.jpg")){ 
        f=temp; 
        break; 
       } 
      } 
      try{ 
       Bitmap bitmap; 
       BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
       bitmap = BitmapFactory.decodeFile(f.getAbsolutePath()); 

       newHeight=600; 
       newWidth=900; 
       //resized is my global bitmap 
       resized = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 

       //show my new bitmap in my ImageView 
       showPicture.setImageBitmap(resized); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     //I choose gallery option 
     else if(requestCode==2){ 
      Uri selectedImage = data.getData(); 
      String[] filePath = {MediaStore.Images.Media.DATA}; 
      Cursor c = getContentResolver().query(selectedImage,filePath,null,null,null); 
      c.moveToFirst(); 
      int columnIndex = c.getColumnIndex(filePath[0]); 
      String picturePath = c.getString(columnIndex); 
      c.close(); 
      Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath)); 

      newHeight=600; 
      newWidth=900; 
      //my global bitmap 
      resized = Bitmap.createScaledBitmap(thumbnail, newHeight, newWidth, true); 
      //show new bitmap in my ImageView 
      showPicture.setImageBitmap(resized); 
     } 
    } 
} 

Когда я включаю свой телефон, я потеряю растровое изображение. Что я могу сделать, пожалуйста? Спасибо большое!

+0

Вы не показываете свой метод 'onCreate()', который здесь важен, поскольку андроид по умолчанию уничтожает и воссоздает самую большую активность при изменении конфигурации (например, вращение). – dhke

ответ

0

Я думаю, что вы сохраните значение своего растрового изображения, позвонив по номеру onSaveInstaceState(Bundle bundle), а затем восстановите его при восстановлении активности.

0

Вы можете сохранить имя файла в ваш файл фотоснимка внутри деятельности:

class MyActivity { 
    File imageFile = null; 
} 

Так как ваша деятельность будет разрушаться при повороте, вы должны сохранить это имя файла изображения в onSaveInstanceState():

public void onSaveInstanceState(Bundle outState) 
{ 
    if (imageFile != null) {   
      outState.putString("IMAGE_FILENAME", imageFile.getAbsolutePath()); 
    } 
} 

Растровые изображения в андроиде являются необязательными, поэтому вместо хранения имени файла вы также можете сохранить Bitmap.

Сохраненная состояние переходит в руки onCreate(), когда ваша деятельность становится воссозданной:

public void onCreate(Bundle savedState) 
{ 
    super.onCreate(savedState); 
    if (savedState != null) { 
     String imagePath = saveState.getString("IMAGE_FILENAME"); 
     if (imagePath != null) { 
      imageFile = new File(imagePath); 
     } 
    } 
    updateImageView(); 
} 

public void updateImageView() 
{ 
    // code from onActivityResult() to load the image 
} 

Боковые Примечания:

File f = new File(Environment.getExternalStorageDirectory().toString()); 
for (File temp: f.listFiles()) { 
    if (temp.getName().equals("temp.jpg")) { 
     f = temp; 
     break; 
    } 
} 

Вы пишете глобальный, внешний каталог хранения. Не делайте этого, используйте каталог файлов вашего приложения. Кроме того, нет необходимости искать фиксированное имя файла в пути, просто проверьте, существует ли файл.

File imageFile = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), imageFileName); 
if (imageFile.exists()) { 
    [...] 
} 
0

Я думаю, что лучший способ сделать это - использовать фрагмент вместо активности. Используйте метод fragment.setRetainInstance (true), и фрагмент не будет уничтожен при включении вашего устройства.

+0

Активность может быть разрушена и воссоздана по другим причинам. Таким образом, сохранение состояния экземпляра является более или менее обязательным, хотя. 'setRetainInstance (true)' позволяет вашему фрагменту жить только через изменения конфигурации, например. переход на другое приложение может привести к исчезновению изображения. – dhke

+0

Хорошо, это важная поправка. благодаря – Maria

Смежные вопросы