Как сохранить состояние интерфейса в моем фрагменте?
У меня есть Activity
который использует ViewPager
создать три Fragment
в ViewPager
класс я установил Fragment
с setRetainInstace(true);
когда они созданы.
Внутри одного из моих Fragment
s Я показываю некоторую редактируемую информацию. это Fragment
запускает DialogFragment
редактировать информацию.
Когда пользователь не меняет ориентацию, я могу обновить информацию и отправить результаты обратно во фрагмент в представлении, однако, как только я изменяю ориентацию и выполняю обновление информации, моя 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);
}
}
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
пример.