2014-01-16 2 views
0

У меня есть Activity, который использует ViewPager для создания трех Fragment s в классе ViewPager. Я устанавливаю Fragment с по setRetainInstace(true);, когда они созданы.Как сохранить состояние интерфейса в моем фрагменте?

Внутри одного из моих Fragment s Я показываю некоторую доступную для редактирования информацию. Это Fragment запускает DialogFragment для редактирования информации.

Когда пользователь не меняет ориентацию, я могу обновить информацию и отправить результаты обратно в Фрагмент в представлении, однако, как только я изменю ориентацию и сделаю обновление в Info, которое я подключил, Interface в методе DialogFragment s onAttach() Я получаю NullPointerException.

Я не понимаю, почему, хотя, каждый раз, когда запускается новый DialogFragment, метод onAttach() всегда называется.

Как это решить? Могу ли я сохранить состояние интерфейса? и если да, то как?

Вот мой DialogFragment Код: GenericDialogFragment Класс используется только для внесения изменений во внешний вид

public class Fragment1 extends GenericDialogFragment implements WebServiceResult{ 



// ------------------------------------------------------------------------- 
// Member Variables 
//-------------------------------------------------------------------------- 
//Webservice Callback 
private WSRequest mActiveRequest = null; 
// The Current Context of the Application 
private Context mClassContext = null; 
// Interface reference for communication 
private static CommunicateResults communicateResults = null; 


// ------------------------------------------------------------------------- 
// New Instance Method 
//--------------------------------------------------------------------------  

public static Fragment1 newInstance(int userId, GenericObject [] objects, GenericGroup [] groups, Object currentObject){ 
    // Initialize a new Fragment1 
    Fragment1 fragment = new Fragment1(); 
    // Create a new Bundle 
    Bundle args = new Bundle(); 

    fragment.setArguments(args); 

    // Return the Fragment1 
    return fragment; 
} 

// ------------------------------------------------------------------------- 
// Class Functions/Methods 
//--------------------------------------------------------------------------  

// States that the Interface is attached to the parent activity 
@Override public void onAttach(Activity activity) 
{ 
    // Perform the Default Behavior 
    super.onAttach(activity); 
    Log.d("ONAttach()","On attach() is called"); 
    // Try 
    try{ 
     // Attach the interface to the activity 
     communicateResults = (CommunicateResults) ((MainActivity) getActivity()).findFragment(EditableFragment1.class); 

    }catch(Exception ex){ 
     // Print the stack trace 
     ex.printStackTrace(); 
    } 
} 

// States that the Dialog's View has been Created 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    // Return the Inflated XML Layout 
    return inflater.inflate(R.layout.fragment1, container, false); 
} 

// States that the fragment has been created, last chance to update the UI 
@Override 
public void onActivityCreated(Bundle savedInstanceState){ 
    // Perform the Default behavior 
    super.onActivityCreated(savedInstanceState); 

    mClassContext = getActivity(); 

    // Get the Arguments passed into the Fragment instance 
    savedStateData = getArguments(); 

    // Reference all the UI Elements in the View  


    // Add listeners to the Button Widgets 


    // If the savedInstanceState is not null, get the current object 
    if(savedStateData != null){ 

     // Get the object out of the state data 
     mCurrentObject = savedStateData.getParcelable(STATE_DATA_CURRENT_OBJECT); 

    } 



} 


//----------------------------------------------------------------------------- 
// Webservice Callback methods 
//----------------------------------------------------------------------------- 

// States that the web service has succeeded 
@Override public void webserviceSucceeded(WebServiceBase finishedService, Object responseData) 
{ 

    Log.d("EDIT Object", responseData.toString()); 

    if(responseData != null){ 

     if(mDeletingObject){ 



      // Send Back to the object to remove 
      communicateResults.sendBackData(mCurrentObject, ACTION_DELETE); 

     }else{ 

      JSONObject tempObject = (JSONObject) responseData; 

      try{ 

       // Parse Data ... 



      }catch(Exception ex){ 

       ex.printStackTrace(); 
       // TODO: The Object was deleted from the Lest 
      } 

      // If we are creating a object, bundle the information to pass to the parent activity 
      if(mCreatingObject){ 

       // Create a new Workout Object 
       mCurrentObject = new Object(); 


       // Callback to Parent Activity to notify that data has changed 
       communicateResults.sendBackData(mCurrentObject, ACTION_CREATE); 

       // Else the Object was updated 
      }else{ 
       // Create a new Object 
       mCurrentObject = new Object(); 


       // Callback to Parent Activity to notify that data has changed 
       communicateResults.sendBackData(mCurrentObject, ACTION_UPDATE); 
      } 
     } 


    } 

    // Dismiss the fragment 


} 


// States that the web service has failed 
@Override 
public void webserviceFailed(WebServiceBase finishedService, 
     Object errorData) { 


    // Display the Error 
    displayErrorData(errorData); 

} 

}

+0

Похоже, что ваша деятельность - это интерфейс, если вы используете onAttach (Activity activity) ;, так почему бы просто не использовать (CastToInterface) getActivty() ;? – Submersed

+0

Моя деятельность - не мой интерфейс. Интерфейс объявлен внутри моего фрагмента с редактируемыми данными. Поэтому Im создает интерфейс в этом фрагменте, а затем я реализую его в DialogFragment.Я попытался внести это изменение, и я получил ClassCastException, потому что он пытается передать интерфейс моей деятельности, где ее не реализовано. –

+0

Gotcha. Можете ли вы разместить свой фрагментный код? – Submersed

ответ

0

Я думаю, что вы ищете onActivityCreated(Bundle bundle);, это Fragment эквивалент Activity класса onRestoreSavedInstanceState(Bundle bundle);.

Из документации:

общественной недействительный onActivityCreated (Bundle savedInstanceState) Добавлен в уровне API 11

Вызывается, когда активность фрагмента была создана и просмотр этого фрагмента иерархия экземпляр. Он может использоваться для выполнения окончательной инициализации после того, как эти части находятся на своем месте, например, получение просмотров или восстановление состояния. Это также полезно для фрагментов, которые используют setRetainInstance (boolean), чтобы сохранить свой экземпляр, так как этот обратный вызов сообщает фрагменту, когда он полностью связан с новым активным экземпляром . Это вызывается после onCreateView (LayoutInflater, ViewGroup, Bundle) и перед onViewStateRestored (Bundle). Параметры savedInstanceState Если фрагмент заново создается из ранее сохраненного состояния , это состояние.

Когда фрагмент разрушается на изменения ориентации, сохранить свое состояние как пары имя-значение в данный вид деятельности Bundle, а затем, когда она должна быть воссоздана, экземпляр в этом методе новый Interface, и установить соответствующие поля/извлеките аргумент в свой новый экземпляр Fragment.

+0

Немного смущен здесь. Разве это не имеет значения, если метод onAttach() вызывается каждый раз, когда создается новый DialogFragment? или это проблема в моем фрагменте, который реализует интерфейс? –

+0

Не уверен, мне нужно будет увидеть, как вы реализовали свой фрагмент. – Submersed

+0

Theres тонны кода в фрагменте Я попытаюсь соединить его, поэтому я делюсь только тем, что вам нужно. –

Смежные вопросы