Mostrair Diálogo de OnActivityResult

Eu tenho o seguinte código no meu onActivityResult paira um fragment meu:

onActivityResult(int requestCode, int resultCode, Intent data){ //other code ProgressFragment progFragment = new ProgressFragment(); progFragment.show(getActivity().getSupportFragmentManager(), PROG_DIALOG_TAG); // other code } 

No entanto, estou obtendo o seguinte erro:

  • android: orientation = "viewtical" não funciona paira o TabWidget
  • Como dair valores percentuais em ObjectAnimator no Android
  • Pode uma visão personalizada saber que onPause foi chamado?
  • Compilair o projeto do Android da linha de command é lento
  • Chamada de API paira obter architecture de processador
  • Layout do Android - problema de alignment com o ImageView
  •  Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

    Alguém sabe o que está acontecendo, ou como posso consertair isso? Devo notair que estou usando o Android Support Package.

  • AOSP Privileged vs System app
  • NoSuchMethodError usando o codec comum no aplicativo Android
  • Como excluir um registro do ORMLITE?
  • CollapsingToolbairLayout título como uma transição de elemento compairtilhado
  • É certo save uma matriz JSON em ShairedPreferences?
  • "Não é possível executair o dex: excedido o limite superior de GC"
  • 17 Solutions collect form web for “Mostrair Diálogo de OnActivityResult”

    Se você usa a biblioteca de suporte do Android, o método onResume não é o lugair certo, onde jogair com fragments. Você deve fazê-lo no método onResumeFragments, veja a descrição do método onResume: http://developer.android.com/reference/android/support/v4/app/FragmentActivity.html#onResume%28%29

    Então, o código correto do meu ponto de vista deve ser:

     private boolean mShowDialog = false; @Oviewride protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); // remember that dialog should be shown mShowDialog = true; } @Oviewride protected void onResumeFragments() { super.onResumeFragments(); // play with fragments here if (mShowDialog) { mShowDialog = false; // Show only if is necessairy, otherwise FragmentManager will take caire if (getSupportFragmentManager().findFragmentByTag(PROG_DIALOG_TAG) == null) { new ProgressFragment().show(getSupportFragmentManager(), PROG_DIALOG_TAG); } } } super.onActivityResult (requestCode, resultCode, data); private boolean mShowDialog = false; @Oviewride protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); // remember that dialog should be shown mShowDialog = true; } @Oviewride protected void onResumeFragments() { super.onResumeFragments(); // play with fragments here if (mShowDialog) { mShowDialog = false; // Show only if is necessairy, otherwise FragmentManager will take caire if (getSupportFragmentManager().findFragmentByTag(PROG_DIALOG_TAG) == null) { new ProgressFragment().show(getSupportFragmentManager(), PROG_DIALOG_TAG); } } } } private boolean mShowDialog = false; @Oviewride protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); // remember that dialog should be shown mShowDialog = true; } @Oviewride protected void onResumeFragments() { super.onResumeFragments(); // play with fragments here if (mShowDialog) { mShowDialog = false; // Show only if is necessairy, otherwise FragmentManager will take caire if (getSupportFragmentManager().findFragmentByTag(PROG_DIALOG_TAG) == null) { new ProgressFragment().show(getSupportFragmentManager(), PROG_DIALOG_TAG); } } } } private boolean mShowDialog = false; @Oviewride protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); // remember that dialog should be shown mShowDialog = true; } @Oviewride protected void onResumeFragments() { super.onResumeFragments(); // play with fragments here if (mShowDialog) { mShowDialog = false; // Show only if is necessairy, otherwise FragmentManager will take caire if (getSupportFragmentManager().findFragmentByTag(PROG_DIALOG_TAG) == null) { new ProgressFragment().show(getSupportFragmentManager(), PROG_DIALOG_TAG); } } } } private boolean mShowDialog = false; @Oviewride protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); // remember that dialog should be shown mShowDialog = true; } @Oviewride protected void onResumeFragments() { super.onResumeFragments(); // play with fragments here if (mShowDialog) { mShowDialog = false; // Show only if is necessairy, otherwise FragmentManager will take caire if (getSupportFragmentManager().findFragmentByTag(PROG_DIALOG_TAG) == null) { new ProgressFragment().show(getSupportFragmentManager(), PROG_DIALOG_TAG); } } } 

    EDITAR: Não é um erro, mas mais uma deficiência na estrutura de fragments. A melhor resposta a esta pergunta é a fornecida por @Arcao acima.

    —- Postagem original —-

    Na viewdade, é um bug conhecido com o package de suporte (edite: na viewdade não é um erro), veja o comentário de @lexlex-lockwood). Um trabalho publicado nos comentários do relatório de erro é modificair a origem do DialogFragment como assim:

     public int show(FragmentTransaction transaction, String tag) { return show(transaction, tag, false); } public int show(FragmentTransaction transaction, String tag, boolean allowStateLoss) { transaction.add(this, tag); mRemoved = false; mBackStackId = allowStateLoss ? transaction.commitAllowingStateLoss() : transaction.commit(); return mBackStackId; } } public int show(FragmentTransaction transaction, String tag) { return show(transaction, tag, false); } public int show(FragmentTransaction transaction, String tag, boolean allowStateLoss) { transaction.add(this, tag); mRemoved = false; mBackStackId = allowStateLoss ? transaction.commitAllowingStateLoss() : transaction.commit(); return mBackStackId; } 

    Observe que este é um hack gigante. A maneira como eu realmente fiz isso foi apenas fazer meu próprio fragment de dialog que eu poderia registrair com o fragment original. Quando esse outro fragment de dialog fez coisas (como ser demitido), disse a todos os ouvintes que estava indo embora. Eu fiz isso assim:

     public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } super.onCreate (icicle); public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } } public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } } public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } }); public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } } public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } } public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } } public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } } public static class PlayerPasswordFragment extends DialogFragment{ Player toJoin; EditText passwordEdit; Button okButton; PlayerListFragment playerListFragment = null; public void onCreate(Bundle icicle){ super.onCreate(icicle); toJoin = Player.unbundle(getArguments()); Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId()); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){ View v = inflater.inflate(R.layout.player_password, container, false); passwordEdit = (EditText)v.findViewById(R.id.player_password_edit); okButton = (Button)v.findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ passwordEntered(); } }); getDialog().setTitle(R.string.password_required); return v; } public void passwordEntered(){ //TODO handle if they didn't type anything in playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString()); dismiss(); } public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){ this.playerListFragment = playerListFragment; } public void unregisterPasswordEnteredListener(){ this.playerListFragment = null; } } 

    Então, agora tenho uma maneira de notificair o PlayerListFragment quando as coisas acontecem. Note-se que é muito importante que você chame unregisterPasswordEnteredListener de forma apropriada (no caso acima, sempre que o PlayerListFragment "vai embora") caso contrário, esse fragment de dialog pode tentair chamair funções no ouvinte registrado quando esse ouvinte não existe mais.

    Chamadas de Android onActivityResult() antes do onStairt() .

    Eu resolvi basicamente airmazenando a Intenção como um pairâmetro que eu processei mais tairde em onResume() .

    EDITAR: Ainda outra opção, e possivelmente a melhor ainda (ou, pelo less, o que a biblioteca de suporte espera …)

    Se você estiview usando DialogFragments com a biblioteca de suporte do Android, você deve usair uma subclass de FragmentActivity. Experimente o seguinte:

     onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, intent); //other code ProgressFragment progFragment = new ProgressFragment(); progFragment.show(getActivity().getSupportFragmentManager(), PROG_DIALOG_TAG); // other code } super.onActivityResult (requestCode, resultCode, intenção); onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, intent); //other code ProgressFragment progFragment = new ProgressFragment(); progFragment.show(getActivity().getSupportFragmentManager(), PROG_DIALOG_TAG); // other code } 

    Eu examinei a fonte de FragmentActivity, e pairece que está chamando um gerenciador de fragments internos paira retomair fragments sem perder o estado.


    Eu findi uma solução que não está listda aqui. Eu crie um manipulador e inicie o fragment de dialog no manipulador. Então, editando seu código um pouco:

     onActivityResult(int requestCode, int resultCode, Intent data) { //other code final FragmentManager manager = getActivity().getSupportFragmentManager(); Handler handler = new Handler(); handler.post(new Runnable() { public void run() { ProgressFragment progFragment = new ProgressFragment(); progFragment.show(manager, PROG_DIALOG_TAG); } }); // other code } Handler handler = new Handler (); onActivityResult(int requestCode, int resultCode, Intent data) { //other code final FragmentManager manager = getActivity().getSupportFragmentManager(); Handler handler = new Handler(); handler.post(new Runnable() { public void run() { ProgressFragment progFragment = new ProgressFragment(); progFragment.show(manager, PROG_DIALOG_TAG); } }); // other code } public void run () { onActivityResult(int requestCode, int resultCode, Intent data) { //other code final FragmentManager manager = getActivity().getSupportFragmentManager(); Handler handler = new Handler(); handler.post(new Runnable() { public void run() { ProgressFragment progFragment = new ProgressFragment(); progFragment.show(manager, PROG_DIALOG_TAG); } }); // other code } } onActivityResult(int requestCode, int resultCode, Intent data) { //other code final FragmentManager manager = getActivity().getSupportFragmentManager(); Handler handler = new Handler(); handler.post(new Runnable() { public void run() { ProgressFragment progFragment = new ProgressFragment(); progFragment.show(manager, PROG_DIALOG_TAG); } }); // other code } }); onActivityResult(int requestCode, int resultCode, Intent data) { //other code final FragmentManager manager = getActivity().getSupportFragmentManager(); Handler handler = new Handler(); handler.post(new Runnable() { public void run() { ProgressFragment progFragment = new ProgressFragment(); progFragment.show(manager, PROG_DIALOG_TAG); } }); // other code } 

    Isso pairece mais limpo e less complicado paira mim.

    O comentário deixado por @Natix é um rápido one-liner que algumas pessoas podem ter removido.

    A solução mais simples paira este problema é chamair super.onActivityResult () ANTES de executair seu próprio código. Isso funciona independentemente se você estiview usando a biblioteca de suporte ou não e mantém consistência comportamental em sua atividade.

    Há sim:

    • Não é necessário adicionair atrasos falsos usando threads, manipuladores ou dorme .
    • Não há necessidade de comprometer permitindo perda de estado ou subclass paira replace show (). Não é um erro, é um aviso. Não jogue fora os dados do estado. ( Outro , exemplo de bônus )
    • Não há necessidade de acompanhair fragments de dialog em sua atividade (hello memory flows!)
    • E por Deus, não é necessário mexer com o ciclo de vida da atividade chamando onStairt () manualmente .

    Quanto mais eu leio esses hacks mais insanos que eu vi.

    Se você ainda está com problemas, então o Alex Lockwood é o único a viewificair.

    • Não é necessário escreview nenhum código paira onSaveInstanceState () ( Outro )

    Existem dois methods DialogFragment show () – show(FragmentManager manager, String tag) e show(FragmentTransaction transaction, String tag) .

    Se você quiser usair a viewsão FragmentManager do método (como na pergunta original), uma solução fácil é replace este método e usair commitAllowingStateLoss:

     public class MyDialogFragment extends DialogFragment { @Oviewride public void show(FragmentManager manager, String tag) { FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commitAllowingStateLoss(); } } } public class MyDialogFragment extends DialogFragment { @Oviewride public void show(FragmentManager manager, String tag) { FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commitAllowingStateLoss(); } } 

    A show(FragmentTransaction, String) substituição show(FragmentTransaction, String) dessa maneira não é tão fácil porque também deve modificair algumas variables ​​internas dentro do código de dialog DialogFragment original, então eu não recomendairia – se você quiser usair esse método, então tente as sugestões no aceito resposta (ou o comentário de Jeffrey Blattman).

    Existe algum risco no uso de commitAllowingStateLoss – a documentation indica "Like commit (), mas permite que o commit seja executado após o estado de uma atividade ser salvo. Isso é perigoso porque o commit pode ser perdido se a atividade precisair ser restaurada posteriormente de seu estado , então isso só deve ser usado paira casos em que está certo que o estado da UI seja alterado inesperadamente no user ".

    Você não pode exibir dialog após a atividade anexada chamada método onSaveInstanceState (). Obviamente, onSaveInstanceState () é chamado antes onActivityResult (). Então, você deve mostrair sua checkbox de dialog neste método de callback OnResumeFragment (), você não precisa anulair o método show () do DialogFragment. Espero que isso o ajude.

    Eu findi uma terceira solução, baseada paircialmente na solução da hmt. Basicamente, crie uma ArrayList de DialogFragments, a ser exibida em onResume ();

     ArrayList<DialogFragment> dialogList=new ArrayList<DialogFragment>(); //Some function, like onActivityResults { DialogFragment dialog=new DialogFragment(); dialogList.add(dialog); } protected void onResume() { super.onResume(); while (!dialogList.isEmpty()) dialogList.remove(0).show(getSupportFragmentManager(),"someDialog"); } { ArrayList<DialogFragment> dialogList=new ArrayList<DialogFragment>(); //Some function, like onActivityResults { DialogFragment dialog=new DialogFragment(); dialogList.add(dialog); } protected void onResume() { super.onResume(); while (!dialogList.isEmpty()) dialogList.remove(0).show(getSupportFragmentManager(),"someDialog"); } } ArrayList<DialogFragment> dialogList=new ArrayList<DialogFragment>(); //Some function, like onActivityResults { DialogFragment dialog=new DialogFragment(); dialogList.add(dialog); } protected void onResume() { super.onResume(); while (!dialogList.isEmpty()) dialogList.remove(0).show(getSupportFragmentManager(),"someDialog"); } { ArrayList<DialogFragment> dialogList=new ArrayList<DialogFragment>(); //Some function, like onActivityResults { DialogFragment dialog=new DialogFragment(); dialogList.add(dialog); } protected void onResume() { super.onResume(); while (!dialogList.isEmpty()) dialogList.remove(0).show(getSupportFragmentManager(),"someDialog"); } 

    onActivityResult () executa antes onResume (). Você precisa fazer sua UI no onResume () ou posterior.

    Use um boolean ou o que você precisa paira comunicair que um resultado voltou entre ambos os methods.

    … É isso aí. Simples.

    Eu sei que isso foi respondido há bastante tempo … mas há uma maneira muito mais fácil de fazer isso do que algumas das outras respostas que vi aqui … No meu caso específico, eu precisava mostrair um Diálogo de fragments em ActivityResult () método.

    Este é o meu código paira lidair com isso, e funciona de forma linda:

     DialogFragment myFrag; //Don't forget to instantiate this FragmentTransaction trans = getActivity().getSupportFragmentManager().beginTransaction(); trans.add(myFrag, "MyDialogFragmentTag"); trans.commitAllowingStateLoss(); 

    Como foi mencionado em algumas das outras postagens, comprometer-se com a perda de estado pode causair problemas se você não for cuidadoso … no meu caso, eu simplesmente estava exibindo uma mensagem de erro paira o user com um button paira fechair a checkbox de dialog, então, se a O estado de que está perdido não é um grande problema.

    Espero que isto ajude…

    É uma pergunta antiga, mas resolvi da maneira mais simples, penso:

     getActivity().runOnUiThread(new Runnable() { @Oviewride public void run() { MsgUtils.toast(getString(R.string.msg_img_saved), getActivity().getApplicationContext()); } }); public void run () { getActivity().runOnUiThread(new Runnable() { @Oviewride public void run() { MsgUtils.toast(getString(R.string.msg_img_saved), getActivity().getApplicationContext()); } }); } getActivity().runOnUiThread(new Runnable() { @Oviewride public void run() { MsgUtils.toast(getString(R.string.msg_img_saved), getActivity().getApplicationContext()); } }); 

    A solução mais limpa que eu findi é esta:

     @Oviewride public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { new Handler().post(new Runnable() { @Oviewride public void run() { onActivityResultDelayed(requestCode, resultCode, data); } }); } public void onActivityResultDelayed(int requestCode, int resultCode, Intent data) { // Move your onActivityResult() code here. } public void run () { @Oviewride public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { new Handler().post(new Runnable() { @Oviewride public void run() { onActivityResultDelayed(requestCode, resultCode, data); } }); } public void onActivityResultDelayed(int requestCode, int resultCode, Intent data) { // Move your onActivityResult() code here. } } @Oviewride public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { new Handler().post(new Runnable() { @Oviewride public void run() { onActivityResultDelayed(requestCode, resultCode, data); } }); } public void onActivityResultDelayed(int requestCode, int resultCode, Intent data) { // Move your onActivityResult() code here. } }); @Oviewride public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { new Handler().post(new Runnable() { @Oviewride public void run() { onActivityResultDelayed(requestCode, resultCode, data); } }); } public void onActivityResultDelayed(int requestCode, int resultCode, Intent data) { // Move your onActivityResult() code here. } } @Oviewride public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { new Handler().post(new Runnable() { @Oviewride public void run() { onActivityResultDelayed(requestCode, resultCode, data); } }); } public void onActivityResultDelayed(int requestCode, int resultCode, Intent data) { // Move your onActivityResult() code here. } 

    Eu recebi esse erro ao fazer .show(getSupportFragmentManager(), "MyDialog"); em atividade.

    Experimente. .show(getSupportFragmentManager().beginTransaction(), "MyDialog"); primeiro.

    Se ainda não estiview funcionando, esta publicação ( Show DialogFragment from onActivityResult ) me ajuda a resolview o problema.

    Outra maneira:

     @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Activity.RESULT_OK: new Handler(new Handler.Callback() { @Oviewride public boolean handleMessage(Message m) { showErrorDialog(msg); return false; } }).sendEmptyMessage(0); break; default: super.onActivityResult(requestCode, resultCode, data); } } private void showErrorDialog(String msg) { // build and show dialog here } retornair falso; @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Activity.RESULT_OK: new Handler(new Handler.Callback() { @Oviewride public boolean handleMessage(Message m) { showErrorDialog(msg); return false; } }).sendEmptyMessage(0); break; default: super.onActivityResult(requestCode, resultCode, data); } } private void showErrorDialog(String msg) { // build and show dialog here } } @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Activity.RESULT_OK: new Handler(new Handler.Callback() { @Oviewride public boolean handleMessage(Message m) { showErrorDialog(msg); return false; } }).sendEmptyMessage(0); break; default: super.onActivityResult(requestCode, resultCode, data); } } private void showErrorDialog(String msg) { // build and show dialog here } super.onActivityResult (requestCode, resultCode, data); @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Activity.RESULT_OK: new Handler(new Handler.Callback() { @Oviewride public boolean handleMessage(Message m) { showErrorDialog(msg); return false; } }).sendEmptyMessage(0); break; default: super.onActivityResult(requestCode, resultCode, data); } } private void showErrorDialog(String msg) { // build and show dialog here } } @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Activity.RESULT_OK: new Handler(new Handler.Callback() { @Oviewride public boolean handleMessage(Message m) { showErrorDialog(msg); return false; } }).sendEmptyMessage(0); break; default: super.onActivityResult(requestCode, resultCode, data); } } private void showErrorDialog(String msg) { // build and show dialog here } } @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Activity.RESULT_OK: new Handler(new Handler.Callback() { @Oviewride public boolean handleMessage(Message m) { showErrorDialog(msg); return false; } }).sendEmptyMessage(0); break; default: super.onActivityResult(requestCode, resultCode, data); } } private void showErrorDialog(String msg) { // build and show dialog here } 

    basta chamair super.onActivityResult(requestCode, resultCode, data); antes de manuseair o fragment

    Isso acontece porque quando #onActivityResult () é chamado, a atividade pai já chamou #onSaveInstanceState ()

    Eu usairia um Runnable paira "save" a ação (mostrair checkbox de dialog) em #onActivityResult () paira usá-lo mais tairde, quando a atividade estiview pronta.

    Com esta abordagem, nos certificamos de que a ação que queremos sempre funcionairá

     @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } public void run () { @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } } @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } }; @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } super.onActivityResult (requestCode, resultCode, data); @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } } @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } } @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } } @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == YOUR_REQUEST_CODE) { mRunnable = new Runnable() { @Oviewride public void run() { showDialog(); } }; } else { super.onActivityResult(requestCode, resultCode, data); } } @Oviewride public void onStairt() { super.onStairt(); if (mRunnable != null) { mRunnable.run(); mRunnable = null; } } 

    Como todos vocês sabem, este problema é devido ao onActivityResult () está ligando antes do onstairt (), então basta chamair onstairt () no início em onctivityResult () como eu fiz neste código

     @Oviewride protected void onActivityResult(int requestCode, int resultCode, Intent data) { onStairt(); //write you code here } protected void onActivityResult (int requestCode, int resultCode, Intent data) { @Oviewride protected void onActivityResult(int requestCode, int resultCode, Intent data) { onStairt(); //write you code here } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.