2016-09-05 6 views
0

Ich habe mit einem Problem in einer Notiz Anwendung gekämpft, die ich mit Hilfe einer Tutorial-Serie gebaut habe. Ich habe gerade einen Dialog erstellt, der es dem Benutzer erlaubt, die Kategorie einer Notiz zu ändern, aber die neue Kategorie ist verloren, wenn die Ausrichtung geändert wird. wie i onSavedInstance überschreiben, indem Tutorial angewiesen, Informationen aus erster aber aus irgendeinem Grund zu speichern ist nicht Code unten gelöst:Handhabung Orientierungsänderung in 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

Versuchen Sie, (android: configChanges = "orientation | screenSize") in der Activity - Manifest-Datei hinzuzufügen, damit die Aktivität für die Orientierungsänderung nicht erneut ausgeführt wird - hier https://developer.android.com/guide/topics/ resources/runtime-changes.html – Tasos

Antwort

0

Öffnen Sie Ihre Anwendung Manifest-Datei und für bestimmte Aktivität, fügen Sie diesen Code:

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

Es ist besser, hinzufügen, um dieses „android: configChanges“ zu jede Aktivität Datenzustand zu halten, selbst wenn Orientierungsänderungen .

+0

danke ein Haufen! das löste mein Problem. Ich bin sehr dankbar, kämpfte für eine Weile mit der –

+0

Großartig es löste Ihr Problem.Wenn möglich, markieren Sie es als ** akzeptierte Antwort **, so dass Menschen mit ähnlichen Problemen finden es hilfreich und zuverlässig. – DsD

0

Haben Sie überprüft, ob onSaveInstanceState tatsächlich aufgerufen zu werden? Dieser Rückruf wird nur aufgerufen, wenn die Aktivität, die das Fragment enthält, zerstört wird. Überprüfen Sie zunächst, ob Ihre Aktivität zerstört wird oder nicht.

+0

ja ich verwendet log, um zu überprüfen, dass es dreimal aufgerufen wurde jedes Mal, wenn der Bildschirm änderte, aber Hinzufügen von "android: configChanges: zu manifestieren das Problem –

Verwandte Themen