2017-02-09 2 views
3

Я тестировал поведение AlertDialog для интеграции в более крупный компонент. Я снова не могу показать тот же диалог. Вот код теста:Отображается тот же AlertDialog снова

public class MainActivity extends AppCompatActivity { 

    private AlertDialog alertDialogACCreationRetry; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     alertDialogACCreationRetry = new AlertDialog.Builder(this) 
       .setTitle("Account creation failed") 
       .setMessage("There was a problem connecting to the Network. Check your connection.") 
       .setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 

        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
        } 
       }).create(); 
     alertDialogACCreationRetry.show(); 

     alertDialogACCreationRetry.show(); 
    } 
} 

Я попытался положить alertDialogACCreationRetry.show(); внутри кнопки Retry, но он по-прежнему не будет показывать. Я также попытался поставить alertDialogACCreationRetry.dismiss(); внутри кнопки Retry, а затем вызывать alertDialogACCreationRetry.show(); снаружи, он все равно не отображается. Более того, страшно, что это не дает мне исключения при перепрофилировании, если это не должно допускаться.

Итак, мой вопрос заключается в следующем: Должен ли я создавать новый диалог каждый раз после того, как он будет уволен (автоматически) при нажатии кнопки?

+0

вы можете попробовать с помощью Dialog. – tahsinRupam

+0

Да, у вас будет новый еще один экземпляр диалога @pulp_fiction –

+0

[Аналогичная проблема и решение (если я правильно понимаю)] (http://stackoverflow.com/questions/6142308/android-dialog-keep-dialog-open- когда-кнопка-нажата) –

ответ

4
public void showAlertDialog() { 
    final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
    builder.setTitle("Time"); 
    builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int i) { 
      dialog.cancel(); 
      // call function show alert dialog again 
      showAlertDialog(); 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 
    final AlertDialog alert = builder.create(); 
    alert.show(); 
} 

enter image description here

+1

Да, это работает. Спасибо! –

+1

Upvote - ваше решение успешно работает в моем более крупном компоненте. –

0

Возможно, что вы звоните .show() до диалог отклонен, поэтому он не работает. Когда вы возвращаетесь из прослушивателя кнопки повтора, диалог отклоняется.

PS это, кажется, согласны с тем, что я предлагаю: https://stackoverflow.com/a/12110191/3286819

Чтобы сделать эту работу, вы должны вызвать шоу снова после того, как сетевой код действительно повторен операцию, вероятно, в фоновом потоке или что-то подобное ,

Наконец, с другой стороны, возможно, имеет смысл просто создать диалог еще раз, так как сохранение одного и того же диалога может привести к утечкам в некоторых случаях.

+0

Принимая сетевую латентность, вопрос в том, что я пробовал вызывать функцию увольнения() перед вызовом show again(), а не только один раз, я написал alertDialogACCreationRetry.show() 7-8 раз подряд, он все еще не show –

+0

Проблема в том, что в действительности происходит то, что сам диалог вызывает .dismiss() сразу после возвращения из вашего слушателя. Решение будет состоять в вызове .show() позже (например, используя .postDelayed(), например: Handler handlerTimer = new Handler(); handlerTimer.postDelayed (new Runnable() {public void run() {/ *. show() * /}}, 100); 'В любом случае помните, что это взломать. –

0

Вам не нужно воссоздать alertDialogACCreationRetry. Вы можете повторно использовать его, но вы не можете отображать сразу несколько диалоговых окон с одним и тем же объектом. Метод show() внутренне проверяет, отображается ли текущее диалоговое окно предупреждения или нет. Если он показывается, он вернется, ничего не сделав, будет показан новый диалог.

Поэтому убедитесь, что вы звоните dismiss() перед вызовом show() в диалоговом

Это то, что я попытался

@Nullable @Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
    @Nullable Bundle savedInstanceState) { 
getActivity().getSupportFragmentManager(); 

alertDialogACCreationRetry = new AlertDialog.Builder(getActivity()) 
    .setTitle("Account creation failed") 
    .setMessage("There was a problem connecting to the Network. Check your connection.") 
    .setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

     } 
    }) 
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
     } 
    }).create(); 
alertDialogACCreationRetry.show(); 

View view = inflater.inflate(R.layout.frag1, container, false); 
TextView viewById = (TextView) view.findViewById(R.id.frag1_text); 
viewById.setOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View v) { 
    alertDialogACCreationRetry.show(); 
    } 
}); 
return view; 
} 

В приведенном выше alertDialogACCreationRetry.show() вызова внутри onClick() покажет диалоговое окно, если не диалог не показывает уже иначе он ничего не делает.

+0

Я отклонил() до вызова show() еще раз, и это не сработало (я упомянул об этом) –

+0

can вы также должны добавить этот код. Вы должны быть уверены, что сначала вызывается 'show()' или 'reject()'. – arjun

0

Вы можете сделать что-то вроде этого:

public class MainActivity extends AppCompatActivity { 

private AlertDialog alertDialogACCreationRetry; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    alertDialogACCreationRetry = new AlertDialog.Builder(this) 
      .setTitle("Account creation failed") 
      .setMessage("There was a problem connecting to the Network. Check your connection.") 
      .setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
       } 
      }).create(); 

    alertDialogACCreationRetry.show(); 

    alertDialogACCreationRetry.getButton(AlertDialog.BUTTON_POSITIVE). 
     setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      boolean yourLogicGoFine = false; 
      if (yourLogicGoFine){ 
       alertDialogACCreationRetry.dismiss(); 
      }else{ 
       Toast.makeText(finalizarActivity, "Something was wrong", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    } 
} 

Удачи!

0

Как указывали другие, причина, по которой вызов show() не вызывает появление диалогового окна, заключается в том, что он еще не уволен. Этот метод работает, устанавливая видимость диалога, а не добавляя еще один диалог, поэтому вы определенно не можете получить 2 слоя одного и того же диалога.

Вы можете добавить кнопку, чтобы вызвать диалог, чтобы убедиться, что диалог полностью отклонен. Пример:

findViewById(R.id.show_button).setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     alertDialogACCreationRetry.show(); 
    } 
}); 

Нажмите кнопку после отклонения диалогового окна.Он обязательно появится снова.

+0

See принятое решение. Даже без добавления кнопки, это работает. Это изящное решение. –

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