2016-09-05 3 views
0

저는 튜토리얼 시리즈를 통해 제작 한 노트 응용 프로그램의 문제로 고심하고 있습니다. 나는 방금 노트를 만들 수있는 대화 상자를 만들었지 만, 방향이 바뀔 때마다 새로운 카테고리는 사라진다. 튜토리얼의 지시에 따라 내가 먼저하지만 어떤 이유에 대한 정보를 저장 onSavedInstance를 오버라이드 (override) 코드 아래 해결되지 : onSaveInstanceState가 실제로 호출하게 될 경우android studio에서 오리엔테이션 변경 처리

package com.workingprogess.notebook; 


    import android.content.DialogInterface; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.support.v7.app.AlertDialog; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.ImageButton; 

    public class NoteEditFragment extends Fragment { 

    private ImageButton noteCatButton; 
    private EditText title; 
    private EditText message; 
    private Button saveButton; 
    private Note.Category savedButtonCategory; 
    private AlertDialog categoryDialogObject; 
    private AlertDialog confirmDialogObject; 

    private static final String MODIFIED_CATEGORY="Modified Category"; 


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


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     if(savedInstanceState!=null){ 
      savedButtonCategory = (Note.Category) savedInstanceState.get(MODIFIED_CATEGORY); 
     } 

     //grab layout and assign to view so that we may access widgets 
     View fragmentLayout = inflater.inflate(R.layout.fragment_note_edit, container, false); 

     //grab widget references 
     title = (EditText) fragmentLayout.findViewById(R.id.editNoteTitle); 
     message = (EditText) fragmentLayout.findViewById(R.id.editMessage); 
     noteCatButton = (ImageButton) fragmentLayout.findViewById(R.id.editNoteButton); 
     saveButton = (Button) fragmentLayout.findViewById(R.id.saveNoteButton); 


     //populate with note data 
     Intent intent = getActivity().getIntent(); 

     title.setText(intent.getExtras().getString(MainActivity.NOTE_TITLE_EXTRA)); 
     message.setText(intent.getExtras().getString(MainActivity.NOTE_MESSAGE_EXTRA)); 


     if(savedButtonCategory !=null){ 
      Log.d("not null","the new image should be carried over"); 
      noteCatButton.setImageResource(Note.categoryToDrawable(savedButtonCategory)); 
     } else { 
      Note.Category noteCat = (Note.Category) intent.getSerializableExtra(MainActivity.NOTE_CATEGORY_EXTRA); 
      savedButtonCategory = noteCat; 
      noteCatButton.setImageResource(Note.categoryToDrawable(noteCat)); 
      Log.e("null","pull from intent"); 
     } 


    //set onclick listeners 
     buildCategoryDialog(); 
     noteCatButton.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       categoryDialogObject.show(); 
      } 
     }); 

     buildConfirmDialog(); 
     saveButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       confirmDialogObject.show(); 
      } 
     }); 



     // Inflate the layout for this fragment 
     return fragmentLayout; 
    } 

    //save info before orientation change. 
    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState){ 
     super.onSaveInstanceState(savedInstanceState); 
     Log.d("save","info is saved"); 
     savedInstanceState.putSerializable(MODIFIED_CATEGORY, savedButtonCategory); 
    } 

    //build pop uo dialog to change note info 
    private void buildCategoryDialog(){ 

     final String[] categories = new String[]{"Personal","Technical","Quote","Finance"}; 
     final AlertDialog.Builder categoryBuilder = new AlertDialog.Builder(getActivity()); 
     categoryBuilder.setTitle("Choose Note Type"); 

     categoryBuilder.setSingleChoiceItems(categories, 0, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int item) { 

       switch (item){ 
        case 0: 
         savedButtonCategory= Note.Category.PERSONAL; 
         noteCatButton.setImageResource(R.drawable.p_icon); 
         break; 
        case 1: 
         savedButtonCategory=Note.Category.TECHNICAL; 
         noteCatButton.setImageResource(R.drawable.t_icon); 
         break; 
        case 2: 
         savedButtonCategory=Note.Category.QUOTE; 
         noteCatButton.setImageResource(R.drawable.q_icon); 
         break; 
        case 3: 
         savedButtonCategory=Note.Category.FINANCE; 
         noteCatButton.setImageResource(R.drawable.f_icon); 
         break; 

       } 
       categoryDialogObject.cancel(); 

      } 
     }); 

     categoryDialogObject=categoryBuilder.create(); 

    } 

    private void buildConfirmDialog(){ 
     final AlertDialog.Builder confirmBuilder = new AlertDialog.Builder(getActivity()); 
     confirmBuilder.setTitle("are you sure?"); 
     confirmBuilder.setMessage("are you sure you want to save this note"); 

     confirmBuilder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       Log.d("Save Note","Note title " + title.getText()+ "Note message " 
        + message.getText()+" note category" + savedButtonCategory); 
       Intent intent = new Intent(getActivity(),MainActivity.class); 
       startActivity(intent); 
      } 
     }); 
     confirmBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       savedButtonCategory=Note.Category.TECHNICAL; 
      } 
     }); 

     confirmDialogObject = confirmBuilder.create(); 

    } 
} 
+0

액티비티 - 매니페스트 파일에 (android : configChanges = "orientation | screenSize")를 추가하여 오리엔테이션 변경 활동을 다시 실행하지 않도록하십시오. https://developer.android.com/guide/topics/ 여기를 확인하십시오. resources/runtime-changes.html – Tasos

답변

0

응용 프로그램 매니페스트 파일 및 특정 활동을 열고,이 코드를 추가 데이터 상태를 유지하기 위해 에 모든 활동을 "안드로이드 configChanges"을 경우에도 방향 변경 .

+0

덕분에 문제가 해결되었습니다. 매우 고맙게 여겨져 잠시 동안 고군분투 중이었습니다 –

+0

문제가 해결 됐으면 가능합니다. ** 가능한 답 **으로 표시하여 비슷한 문제를 가진 사람들이 도움이되고 믿을만한 사람을 찾을 수 있도록하십시오. – DsD

0

당신은 확인해 봤어? 이 콜백은 프래그먼트를 포함하는 활동이 파괴되는 경우에만 호출됩니다. 그래서, 당신의 활동이 파괴되는지 아닌지 먼저 확인하십시오.

<activity 
     android:name=".MainActivity" //Activity where the problem is occuring 
     android:configChanges="screenLayout|orientation|screenSize"> 

더 나은이 추가 :

+0

예 로그를 사용하여 화면이 변경 될 때마다 세 번 호출되었지만 "android : configChanges :"를 추가하여 매니페스트가 문제를 해결 함을 확인했습니다 –