簡體   English   中英

如何在方向改變時將圖像保留在片段中

[英]how to retain images in fragments on orientation changes

我有一個片段,其中我有圖像按鈕“產品圖像”,我正在將圖像加載到具有圖庫意圖的圖像按鈕中,並使用Glide庫加載該圖像,以便保留圖像,我正在使用onSavedInstanceState()但問題是,當我將方向更改為橫向時,它會保留圖像,但是當我再次切換回縱向模式時,它並不會保留圖像,並且如果我正在執行某些技術操作,則會給我一個空指針異常錯誤的請指導,因為我是android開發的新手。 這是我的fragemnt代碼。

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) 

首次旋轉時,將設置字段(imageUri)。 onSaveInstanceState()將在旋轉時在捆綁包中保留此字段。

現在,在橫向視圖中,您將從onCreate()的包中讀取並獲取您存儲的值。 但是請注意, imageUriimageUri存儲為myUriimageUri它將為null。

當您第二次旋轉時, onSaveInstanceState()不會持久化imageUri因為它為null。 但是現在它是縱向的,它將嘗試讀取它(捆綁包不為null),返回null(因為鍵“ imageuri”沒有值),並且在Uri.parse中獲得了空指針。

您可以通過刪除字段myUri並將onCreate()的包中的值分配給imageUriimageUri 我認為-我正在通過手機閱讀!

覆蓋方法onCreate並添加setRetainInstance(true),如下所示:

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

暫無
暫無

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

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