2016-12-25 4 views
0

У меня есть фрагмент, в котором у меня есть кнопка изображения «изображение продукта», я загружаю изображение в это изображение с целью создания галереи и загружаю это изображение с использованием библиотеки Glide, чтобы для сохранения изображений, которые я использую onSavedInstanceState(), но проблема в том, что когда я меняю ориентацию на пейзаж, она сохраняет изображение, но когда я снова переключаюсь обратно в портретный режим, он не сохраняет изображение и дает мне исключение нулевого указателя , если есть какая-то техническая вещь, которую я делаю неправильно, пожалуйста, объясните, потому что я вроде как новый для разработки Android. вот мой код фрагмента.Как сохранить изображения во фрагментах при изменении ориентации

public class NoteEditFragment extends Fragment { 

ImageButton productImage; 
private static final int REQUEST_OPEN_RESULT_CODE = 0; 
private Uri mImageUri; 
EditText productName; 
EditText productPrice; 
EditText productDescription; 
AlertDialog confirmDialogObject; 
Uri myuri; 




public NoteEditFragment() { 
    // Required empty public constructor 
} 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 


    View FragmentLayout = inflater.inflate(R.layout.fragment_note_edit, container, false); 
    productImage = (ImageButton) FragmentLayout.findViewById(R.id.editNoteButton); 

    if(savedInstanceState != null){ 
      myuri = Uri.parse(savedInstanceState.getString("imageuri")); 

     Glide.with(this) 
       .load(myuri) 
       .into(productImage); 
    } 

    productName = (EditText) FragmentLayout.findViewById(R.id.EditNoteTitle); 

    Intent intent = getActivity().getIntent(); 

      }); 

    productImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent1 = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
      intent1.addCategory(Intent.CATEGORY_OPENABLE); 
      intent1.setType("image/*"); 
      startActivityForResult(intent1, REQUEST_OPEN_RESULT_CODE); 
     } 
    }); 

    return FragmentLayout; 
} 
@Override 
public void onSaveInstanceState(Bundle outState) { 

    if(mImageUri != null){ 
     outState.putString("imageuri",mImageUri.toString());} 
    super.onSaveInstanceState(outState); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 
    if(requestCode == REQUEST_OPEN_RESULT_CODE && resultCode == Activity.RESULT_OK) { 
     if(resultData != null) { 
      mImageUri = resultData.getData(); 

      Glide.with(this) 
        .load(mImageUri) 
        .into(productImage); 
     } 
    } 
} 

и вот им ошибка при получении

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.ibrahim_01.notebookapp, PID: 4102 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ibrahim_01.notebookapp/com.example.ibrahim_01.notebookapp.NoteDetailActivity}: java.lang.NullPointerException: uriString 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
         at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077) 
         at android.app.ActivityThread.-wrap15(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:148) 
         at android.app.ActivityThread.main(ActivityThread.java:5417) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
        Caused by: java.lang.NullPointerException: uriString 
         at android.net.Uri$StringUri.<init>(Uri.java:475) 
         at android.net.Uri$StringUri.<init>(Uri.java) 
         at android.net.Uri.parse(Uri.java:437) 
         at com.example.ibrahim_01.notebookapp.NoteEditFragment$override.onCreateView(NoteEditFragment.java:66) 
         at com.example.ibrahim_01.notebookapp.NoteEditFragment$override.access$dispatch(NoteEditFragment.java) 
         at com.example.ibrahim_01.notebookapp.NoteEditFragment.onCreateView(NoteEditFragment.java:0) 
         at android.app.Fragment.performCreateView(Fragment.java:2220) 
         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973) 
         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
         at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1130) 
         at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1953) 
         at android.app.FragmentController.dispatchActivityCreated(FragmentController.java:152) 
         at android.app.Activity.performCreateCommon(Activity.java:6232) 
         at android.app.Activity.performCreate(Activity.java:6239) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
         at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)  
         at android.app.ActivityThread.-wrap15(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:148)  
         at android.app.ActivityThread.main(ActivityThread.java:5417)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

ответ

3

При повороте в первый раз, в поле (imageUri). onSaveInstanceState() будет продолжать вращаться в этом поле.

Теперь в ландшафте вы прочитаете из комплекта в onCreate() и получите значение, которое вы сохранили. Но учтите, что imageUri будет пустым, так как вы сохраните его вместо myUri.

Когда вы поворачиваете второй раз, onSaveInstanceState() не будет сохраняться imageUri, так как он равен нулю. Но теперь в портрете он попытается прочитать его (пакет не является нулевым), возвращает значение null (потому что для ключа «imageuri» не было значения), и вы получите нулевой указатель в Uri.parse.

Вы можете решить, удалив поле myUri и присвой в этом поле значения из onCreate() по адресу imageUri. Я думаю - я читаю это на своем телефоне!

+0

это сработало для меня – user3094279

+0

Вот как отметить ответ как принято http://meta.stackexchange.com/a/5235/231780 – ataulm

-1

Переопределить метод OnCreate и добавить setRetainInstance (правда), как это:

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