![](/img/trans.png)
[英]Android Webview using Fragments to Retain text data across orientation changes
[英]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()
的包中讀取並獲取您存儲的值。 但是請注意, imageUri
將imageUri
存儲為myUri
, imageUri
它將為null。
當您第二次旋轉時, onSaveInstanceState()
不會持久化imageUri
因為它為null。 但是現在它是縱向的,它將嘗試讀取它(捆綁包不為null),返回null(因為鍵“ imageuri”沒有值),並且在Uri.parse中獲得了空指針。
您可以通過刪除字段myUri
並將onCreate()
的包中的值分配給imageUri
來imageUri
。 我認為-我正在通過手機閱讀!
覆蓋方法onCreate並添加setRetainInstance(true),如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.