Как сохранить состояние интерфейса в моем фрагменте?

У меня есть Activity который использует ViewPager создать три Fragmentв ViewPager класс я установил Fragmentс setRetainInstace(true); когда они созданы.

Внутри одного из моих Fragments Я показываю некоторую редактируемую информацию. это Fragment запускает DialogFragment редактировать информацию.

Когда пользователь не меняет ориентацию, я могу обновить информацию и отправить результаты обратно во фрагмент в представлении, однако, как только я изменяю ориентацию и выполняю обновление информации, моя Interface который прикреплен в DialogFragments 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);

}

}

1 ответ

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

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

public void onActivityCreated (Bundle saveInstanceState) Добавлено в API уровень 11

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

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

Другие вопросы по тегам