2015-08-22 4 views
0

Я реализовал диалог да/нет, который отображается при нажатии кнопки «Назад». если пользователь нажмет «да, я хочу уйти», приложение закрывается. все работает отлично в моем эмуляторе, однако, когда я установил приложение на свой телефон, при нажатии «да» приложение переходит на один шаг/действие назад и закрывается только тогда, когда оно проходит все изменения, которые я сделал в нем. Это происходит только с моей галактикой s4, и что самое интересное, у меня не было такой же проблемы, когда я установил приложение месяц назад на том же телефоне. Во всяком случае, вот код да нет диалога:super.finish() не закрывает приложение

public class YesNoDialog extends DialogFragment { 

    Button btnYes, btnNo; 
    static String dialogTitle; 

    public interface YesNoDialogListener { 
     void onFinishYesNoDialog(boolean state); 
    } 

    public YesNoDialog(){ 

    } 


    public void setDialogTitle(String title){ 
     dialogTitle = title; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_yes_no_dialog, container, false); 

     btnYes = (Button) view.findViewById(R.id.btnYes); 
     btnNo = (Button) view.findViewById(R.id.btnNo); 

     getDialog().setTitle(dialogTitle); 

     btnYes.setOnClickListener(btnListener); 
     btnNo.setOnClickListener(btnListener); 

     return view; 
    } 

    private View.OnClickListener btnListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      YesNoDialogListener activity = (YesNoDialogListener) getActivity(); 

      String state = ((Button) v).getText().toString(); 
      if (state.equals("Yes")) { 
       activity.onFinishYesNoDialog(true); 
      } else { 
       dismiss(); 
      } 

     } 
    }; 

} 

и MainActivity:

@Override 
public void onFinishYesNoDialog(boolean state) { 
    if (state){ 
     super.finish(); 
    } 
} 


private void showYesNoDialog() { 
    YesNoDialog yesNo = new YesNoDialog(); 
    yesNo.setDialogTitle("Leaving Project Planner"); 
    yesNo.show(mFragmentManager, "yes/no dialog"); 
} 

public void onBackPressed() { 
    showYesNoDialog(); 
} 
+1

только называют 'отделка() ' –

+0

nah, тот же про blem:/ –

+0

'finish()' только закрывает Activity. Если в стеке истории есть другие действия, они не будут завершены, и один из них, вероятно, появится на экране. – Karakuri

ответ

2

Это должно быть

state.equalsIgnorecase("Yes") 

и вызвать finish(), а не супер вызова.

Я хотел бы предложить несколько изменений, если вы не возражаете :)

Не сравнить строки внутри ViewClickinterface вы можете сравнить идентификаторы вместо этого.

private View.OnClickListener btnListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch v.getId(): 
      case R.id.btnYes: 
       dismiss(); 
       callback.onFinishYesNoDialog(); 
      break; 
      case R.id.btnNo: 
       dismiss(); 
      break; 
     } 
} 

Вместо того, чтобы иметь setDialogTitle() вы можете создать статический метод, который возвращает диалоговый экземпляр с параметрами Диалога инициализирован.

Что-то вроде этого:

private String dialogTitle; 
private YesNoDialogListener callback; 

public static YesNoDialog newInstance(String title, YesNoDialogListener callback){ 
    YesNoDialog d = new YesNoDialog(); 
    d.dialogTitle = title; 
    d.callback = callback; 
    return d; 
} 

На вашем MainActivity инициализации диалога:

YesNoDialog d = YesNoDialog.newInstance("My title...", this); 
d.show(mFragmentManager, "yes/no dialog"); 

Наконец ваш callback на MainActivity будет выглядеть следующим образом:

@Override 
public void onFinishYesNoDialog() { 
    finish(); 
} 
+0

Я сделал эти изменения, и теперь, когда я нажимаю «Да», он не делает ни одного шага назад, однако, также не закрывает приложение, он начинает активность снова столько раз, сколько изменений я сделал. Я попробовал super.onBackPressed вместо finish(), но с точно таким же результатом. –

+0

@AnaKoridze проверить изменения. –

+0

дайте мне знать, если у вас возникли проблемы, и не забудьте принять ответ, если он вам помог :) –

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