2014-10-16 5 views
0

У меня есть фрагмент, внутри которого я использую AlertDialog. Нет никаких проблем при закрытии AlertDialog в Activity, но когда я использовал тот же код в Fragment, AlertDialog не закрывает , пока я не нажимаю кнопку минимум 3 раза.AlertDialog внутри Фрагмент не закрывается при нажатии кнопки

Также после того, как я нажимаю кнопку Ok, alertDialog замерзает в течение 2 секунд, после чего отображаются сообщения Toast. Но диалог не закрывается.

Я также пробовал использовать dialog.dismiss(). Но проблема остается такой же.

Вот мой класс CheckFragment.

public class ChecckFragment extends Fragment implements OnItemSelectedListener { 
    private static AlertDialog alertDialog; 
    private Context context 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     context = this.getActivity();  
     } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    //other codes.... 
    View btnCheck = (Button) rootView.findViewById(R.id.btnSaveNew); 
    btnCheck.setOnClickListener(listener); 
     } 
    private OnClickListener listener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     createCheckBox(); 
     alertDialog.show(); 
     } 
    } 
    //Function to create checkBox. 
    private void createCheckBox(){ 
    final CharSequence[] checkSequences = {" Low "," Mid "," High "," Very High"}; 
    final ArrayList<Integer> itemList = new ArrayList<>(); 

    AlertDialog.Builder checkBuilder= new AlertDialog.Builder(context); 
    checkBuilder.setTitle("Select School Leaving Reason"); 
    checkBuilder.setMultiChoiceItems(checkSequences, null, new   DialogInterface.OnMultiChoiceClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int indexSelected, boolean isChecked) { 
      if (isChecked) { 
       itemList.add(indexSelected); 
      } else if (itemList.contains(indexSelected)) { 
       itemList.remove(Integer.valueOf(indexSelected)); 
      } 
     } 
    }); 

    checkBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      StringBuilder sb = new StringBuilder(); 
      for(int str : itemList){ 
      sb.append(","); //separating contents using semi colon 
       sb.append(str); 
      } 
      sb.deleteCharAt(0); //Delete chatacter at 0. 
      String string = sb.toString(); 
     Toast.makeText(context, "Selected Items:"+ sb, Toast.LENGTH_LONG).show(); 
     alertDialog.dismiss();//Called dismiss here but dialog doesnt closes 
     } 
    }); 
    checkBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      alertDialog.dismiss();//Called dismiss here too but dialog doesnt closes 
     } 
    }); 

    alertDialog = checkBuilder.create(); 

} 
} 

Я действительно застрял в парне. Пожалуйста помоги!!!!

+1

Необходимо вызвать alertDialog = checkBuilder.create(); а затем alertDialog.show(); – Opiatefuchs

+0

Я пробовал, но мое предупреждение еще не закрывается. – Crawler

+0

Вы можете обновить свой код выше? – Opiatefuchs

ответ

2

Если вы работаете с фрагментами DialogFragment является наиболее Рекомендован метод использовать. Но если вы хотите придерживаться Alert Dialog, вы не должны объявлять свой createCheckBox() в своем классе фрагмента, поскольку getActivity иногда может заморозить ваш фрагмент, и поэтому alertDialog не отклоняется. Чтобы решить этот вопрос объявить createCheckBox() метод в классе FragmentActivity, как показано ниже:

private void createCheckBox(){ 
    final CharSequence[] checkSequences = {" Low "," Mid "," High "," Very High"}; 
    final ArrayList<Integer> itemList = new ArrayList<>(); 

    AlertDialog.Builder checkBuilder= new AlertDialog.Builder(context); 
    checkBuilder.setTitle("Select School Leaving Reason"); 
    checkBuilder.setMultiChoiceItems(checkSequences, null, new   DialogInterface.OnMultiChoiceClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int indexSelected, boolean isChecked) { 
      if (isChecked) { 
       itemList.add(indexSelected); 
      } else if (itemList.contains(indexSelected)) { 
       itemList.remove(Integer.valueOf(indexSelected)); 
      } 
     } 
    }); 

    checkBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      StringBuilder sb = new StringBuilder(); 
      for(int str : itemList){ 
      sb.append(","); //separating contents using semi colon 
       sb.append(str); 
      } 
      sb.deleteCharAt(0); //Delete chatacter at 0. 
      String string = sb.toString(); 
     Toast.makeText(context, "Selected Items:"+ sb, Toast.LENGTH_LONG).show(); 
     alertDialog.dismiss();//Called dismiss here but dialog doesnt closes 
     } 
    }); 
    checkBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      alertDialog.dismiss();//Called dismiss here too but dialog doesnt closes 
     } 
    }); 

    alertDialog = checkBuilder.create(); 
    alertDialog.show(); 
} 
//*************************Method for selecting dialog*******************************// 

    protected Dialog onCreateDialog(int id) { 
      switch (id) { 
      case ALERT_DIALOG: 
       createCheckBox(0); 
       return alertDialog;   
      return null; 
     } 
    }  
end 
Now from your activity class call createCheckBox() method like this: 
begin(delete begin end) 
public class ChecckFragment extends Fragment implements OnItemSelectedListener { 
    private static AlertDialog alertDialog; 
    private final int ALERT_DIALOG = 0; 
    private Context context 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     context = this.getActivity();  
     } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    //other codes.... 
    View btnCheck = (Button) rootView.findViewById(R.id.btnSaveNew); 
    btnCheck.setOnClickListener(listener); 
     } 
    private OnClickListener listener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     getActivity().showDialog(ALERT_DIALOG); //Calls your createMethod from activity class. 
     } 
    } 
} 
end 

Это может быть полезно для вас.

+0

действительно приятное объяснение .. thnks он решил мою проблему. – Crawler

0

Используйте этот код

AlertDialog alertDialog= new AlertDialog.Builder(this).create(); тогда, Просто позвоните alertDialog.dismiss();

будет уверен работать.

+0

он тоже не работает. – Crawler

0

Вы должны инициализировать alerDialogBuilder, как checkBuilder и закрытие AlertDialog

AlertDialog.Builder checkBuilder = new AlertDialog.Builder(context); 

пытаются закрыть checkBuilder

checkBuilder.dismiss(); 
+0

checkbuiler не поддерживает метод reject(), поэтому я использовал AlertDialog. выше код работает нормально в работе проблема возникает только в фрагменте. – Crawler

0

Вы сделали глупую ошибку. Вы должны уволить DialogInterface в то время как вы пытаетесь уволить AlertDialog

изменения:

alertDialog.dismiss(); 

к

dialog.dismiss(); 

где диалог является аргументом onClick ->public void onClick(DialogInterface dialog, int which)

0

Вам нужно чтобы переместить этот код alertDialog.show(); в систему createCheckBox() после этого

alertDialog = checkBuilder.create(); 
alertDialog.show(); 

, а не здесь

private OnClickListener listener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
    createCheckBox(); 
    alertDialog.show();// remove from here 
    } 
    } 

И для положительного и отрицательного нажатия кнопки на AlertDialog смещать с

dialog.dismiss(): 
0
AlertDialog.Builder checkBuilder; 

public class ChecckFragment extends Fragment implements OnItemSelectedListener { 
private static AlertDialog alertDialog; 
private Context context 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = this.getActivity();  
    } 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
//other codes.... 
View btnCheck = (Button) rootView.findViewById(R.id.btnSaveNew); 
btnCheck.setOnClickListener(listener); 
    } 
private OnClickListener listener = new OnClickListener() { 

@Override 
public void onClick(View v) { 
    createCheckBox(); 

    } 
} 
//Function to create checkBox. 
private void createCheckBox(){ 
final CharSequence[] checkSequences = {" Low "," Mid "," High "," Very High"}; 
final ArrayList<Integer> itemList = new ArrayList<>(); 

checkBuilder= new AlertDialog.Builder(context); 
checkBuilder.setTitle("Select School Leaving Reason"); 
checkBuilder.setMultiChoiceItems(checkSequences, null, new    DialogInterface.OnMultiChoiceClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int indexSelected, boolean isChecked) { 
     if (isChecked) { 
      itemList.add(indexSelected); 
     } else if (itemList.contains(indexSelected)) { 
      itemList.remove(Integer.valueOf(indexSelected)); 
     } 
    } 
}); 

checkBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     StringBuilder sb = new StringBuilder(); 
     for(int str : itemList){ 
     sb.append(","); //separating contents using semi colon 
      sb.append(str); 
     } 
     sb.deleteCharAt(0); //Delete chatacter at 0. 
     String string = sb.toString(); 
    Toast.makeText(context, "Selected Items:"+ sb, Toast.LENGTH_LONG).show(); 
    dialog.dismiss();//Called dismiss here but dialog doesnt closes 
    } 
}); 
checkBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     dialog.dismiss(); //<--------------------------------error found-- 
    } 
}); 

alertDialog = checkBuilder.create(); 
alertDialog.show(); 

    } 

} 
+0

Надеюсь, что это сработает! –

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