Я пытаюсь использовать Android Spinner в пользовательском диалоге, но когда я нажимаю на Spinner, открывается список с элементами, и вы можете нажать на них, и представление закрывается, но ни один из элементов не выбирается.Когда я использую точно такой же код в обычном фрагменте, он работает нормально.
И поскольку я нигде не нашел ничего полезного, нужно ли мне что-то знать при использовании счетчика в диалоге?
CustomDialog Класс:
public SelectionDialog(Activity context, ArrayAdapter<T> arrayAdapter, List<T> objects) {
super(context);
this.activity = context;
this.arrayAdapter = arrayAdapter;
this.objects = objects;
}
@SuppressLint("ResourceAsColor")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_selection,null);
setContentView(view);
BodyMenuCard parentCard = view.findViewById(R.id.parentCard);
parentCard.setHeader(header);
TextView textView = parentCard.getCardBody().findViewById(R.id.bodyText);
textView.setText(description);
yesBtn = parentCard.getCardBody().findViewById(R.id.btn_yes);
//spinner = parentCard.getCardBody().findViewById(R.id.employeeSpinner);
spinner = view.findViewById(R.id.employeeSpinner);
spinnerHandler = new EmployeeSpinnerHandler(getContext(), spinner, (List<Employee>)
toggleYesBtn(false);
if (iconRessoruce != -1) parentCard.setIcon(iconRessoruce);
if (backgroundColor != -1) parentCard.setCircleColor(backgroundColor);
if (successfullCallback != null) yesBtn.setOnClickListener((v -> successfullCallback.onClick(this)));
if (abbortCalllback != null) {
parentCard.getCardBody().findViewById(R.id.btn_no).setOnClickListener((v -> abbortCalllback.onClick(this)));
} else {
parentCard.getCardBody().findViewById(R.id.btn_no).setOnClickListener(v -> this.dismiss());
}
}
EmployeeSpinnerAdapter
public class EmployeeSpinnerAdapter extends ArrayAdapter<Employee> {
private Map<String, ColorStateList> employeeColors;
private List<Employee> employees;
private RandomMaterialColor randomColor;
public EmployeeSpinnerAdapter(Context context, List<Employee> employees) {
super(context, R.layout.employee_spinner, employees);
setDropDownViewResource(R.layout.employee_spinner);
this.employees = employees;
this.employeeColors = new HashMap<>();
}
private class ViewHolder {
private GradientDrawable background;
private TextView header;
private TablePart idField;
private ViewHolder(View view) {
if (randomColor == null) randomColor = new RandomMaterialColor(view.getResources(), view.getContext());
ImageView iv = view.findViewById(R.id.icon_view);
background = (GradientDrawable) iv.getBackground().mutate();
header = view.findViewById(R.id.header);
idField = view.findViewById(R.id.description);
}
private void populate(Employee employee) {
header.setText(employee.getName());
idField.update(employee.getId());
ColorStateList color = employeeColors.getOrDefault(employee.getId(), ColorStateList.valueOf(randomColor.getMatColor("A700")));
background.setColor(color);
}
}
@Override
public int getCount() {
return employees.size();
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return obtainView(position, convertView, parent);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
return obtainView(position, convertView, parent);
}
private View obtainView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.employee_spinner, parent, false);
convertView.setTag(new ViewHolder(convertView));
}
ViewHolder vh = (ViewHolder) convertView.getTag();
vh.populate(employees.get(position));
return convertView;
}
}
EmployeeSpinnerHandler Цель этого класса - точнотот же код обрабатывает Spinner внутри диалога и снаружи, чтобы найти ошибку.
public class EmployeeSpinnerHandler {
private Context context;
private Spinner spinner;
private EmployeeSpinnerAdapter adapter;
private List<Employee> employees;
public EmployeeSpinnerHandler(Context context, Spinner spinner, List<Employee> employees) {
this.context = context;
this.spinner = spinner;
this.employees = employees;
setUp();
}
private void setUp() {
adapter = new EmployeeSpinnerAdapter(getContext(), employees);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
FancyToast.makeText(getContext(), "selected: " + employees.get(position).getName(), Toast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
//toggleYesBtn(true);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
//toggleYesBtn(false);
FancyToast.makeText(getContext(), "selected: none", Toast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
}
});
}
public void updateObjects(List<Employee> employees) {
this.employees.clear();
this.employees.addAll(employees);
adapter.notifyDataSetChanged();
}
}
Spinner внутри обычного фрагмента
spinner = view.findViewById(R.id.employeeSpinner);
EmployeeSpinnerHandler spinnerHandler = new EmployeeSpinnerHandler(getContext(), spinner, objects);
Примечание: В случаях с кабиной дата извлекается из REST-Api, но она все еще работает только в обычном фрагменте.
И теперь проблема в том, что если я использую EmployeeSpinnerHandler на Spinner, расположенном внормальный фрагмент, он работает, но если я использую Spinner в диалоге выбора, вы можете щелкнуть по spinner, и элементы появятся, но их нельзя будет выбрать (см. изображения).
Изображения:
CПользовательский диалог со Spinner
Всплывающее окно из Spinner в настраиваемом диалоге, в котором можно увидеть данные, присутствующие, но при щелчке они закрывают только всплывающее окно
Обтекатель, работающий внутри нормального фрагмента