В моем контексте проекта у меня есть кнопка b
в фрагменте f(1)
в действии a
.«Невозможно выполнить это действие после onSaveInstanceState» при замене фрагмента
Фрагмент f(x)
является экземпляром F
, где содержание зависит от аргумента x
Мне нужно заменить текущий экземпляр f(1)
экземпляром f(2)
на b
клик событие:
От деятельности
a
:private void setFragment(int x) { Bundle args = new Bundle(); args.putInt("x", x); F f = new F(); f.setArguments(args); f.setListener(new F.Listener() { public void onButtonClick(int x) { setFragment(x); } }); getSupportFragmentManager() .beginTransaction() .replace(ID, f) .commit(); }
Из фрагмента
f
:b.setOnClickListener(new View.onClickListener() { public void onClick(View view) { listener.onButtonClick(x + 1); } });
Моей проблемы:
Исключения составляет бросить на b
событии нажатия только при изменении состояния конфигурации происходит:
Ява. lang.IllegalStateException: не удается выполнить это действие после onSaveInstanceState
Какая у меня ошибка? Я прочитал много сообщений об этом исключение, но я не нашел любое решение
Edit: Я просто сделать тест без AsyncTask см код:
Попробуйте повернуть экран и нажать кнопку
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
if (state == null) {
setFragment(1);
}
}
private void setFragment(int id) {
Bundle args = new Bundle();
args.putInt("id", id);
MyFragment myFragment = new MyFragment();
myFragment.setArguments(args);
myFragment.setListener(new MyFragment.Listener() {
@Override
public void onClick(int id) {
setFragment(id);
}
});
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment, myFragment)
.commit();
}
public static class MyFragment extends Fragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle state) {
return new Button(getActivity()) {
{
setText(String.valueOf(getArguments().getInt("id")));
setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(getArguments().getInt("id") + 1);
}
});
}
};
}
private static interface Listener {
public void onClick(int id);
}
private Listener listener;
public void setListener(Listener listener) {
this.listener = listener;
}
}
}
Вы пришли по этому адресу http://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-h, ответ говорит, что у вас есть использовать 'transaction.commitAllowingStateLoss();' вместо 'transaction.commit();' – Yazan
Спасибо, мне жаль, что я поменял свой пост, я сказал большой ***. Да, я пробовал, но он не работает – alex
Я бы предложил изменить свой подход, чтобы заменить фрагмент с помощью кнопки, которая является частью активности, а не самого фрагмента. Вы можете попробовать разместить его под текущим фрагментом. – ata