Android 微调器 - 添加来自不同片段的新项目重新进入背面

Android spinner - add new item from a different fragment re-enters on back

我有一个包含微调器的片段。微调器使用自定义项目,我进行了修改,以便将最后一个项目用作添加新项目按钮。

当您单击新项目按钮时,它会从主 activity 打开一个新片段(并将其添加到后台堆栈)。 问题是,如果我从新片段中单击返回(按钮),它会重新打开添加新项目片段。当我没有在新项目片段中设置断点时,出现这种行为很奇怪。

public class MainActivity extends AppCompatActivity implements EditFragment.EditInteractionListener {
    //.........
    @Override
    public void addNewType() {
        Fragment addTypeFragment = AddTypeFragment.newInstance(null);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.main_frame, addTypeFragment)
                .addToBackStack(AddTypeFragment.BUNDLE_KEY)
                .commit();
    }
    //.........
}

public Class EditFragment extends Fragment {
    //..............
    private EditInteractionListener fragmentListener;
    //..............
    private void initTypeSpinner(View view) {
        if (view == null) {
            return;
        }

        Spinner spinner = (Spinner) view.findViewById(R.id.type_spinner);
        MainActivity mainActivity = (MainActivity) activity;
        List<Type> typeList = new ArrayList<>();
        try {
            typeList = mainActivity.getDatabaseHelper().getDao(Type.class).queryForAll();
        } catch (SQLException e) {
            Log.e(this.getClass().getName(), e.getMessage());
        }

        TypeSpinnerAdapter TypeSpinnerAdapter =
                new TypeSpinnerAdapter(getActivity(), R.layout.spinner_item, typeList.toArray(new Type[typeList.size() + 1]));
        spinner.setAdapter(TypeSpinnerAdapter);
        spinner.setOnItemSelectedListener(new TypeSelectedListener(fragmentListener, TypeSpinnerAdapter));
    }
    //............
}

public Class AddTypeFragment extends Fragment {
    //.... (some code for the view)
}

public class TypeSelectedListener implements AdapterView.OnItemSelectedListener {

    private EditFragment.EditInteractionListener editInteractionListener;
    private TypeSpinnerAdapter adapter;

    public TypeSelectedListener(EditFragment.EditInteractionListener editInteractionListener,
                                    TypeSpinnerAdapter adapter) {
        this.editInteractionListener = editInteractionListener;
        this.adapter = adapter;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Type Type = (Type) parent.getItemAtPosition(position);
        if (Type == null
                && view != null
                && position == (parent.getCount() - 1)) {
            editInteractionListener.addNewType();
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        Toast.makeText(parent.getContext(),
                "onNothingSelected",
                Toast.LENGTH_SHORT).show();
    }
}

好的,我修好了。适配器 select 在 OnItemSelectedListener.onItemSelected(...) 运行 之后(显然)使用相同的项目,这让我陷入了创建新项目的循环。

我更改了代码,以便 select 创建新项目时的第一个索引:

public class TypeSelectedListener implements AdapterView.OnItemSelectedListener {

    private EditFragment.EditInteractionListener editInteractionListener;
    private Spinner spinner;

    public TypeSelectedListener(EditFragment.EditInteractionListener editInteractionListener,
                                    Spinner spinner) {
        this.editInteractionListener = editInteractionListener;
        this.spinner = spinner;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Type type = (Type) parent.getItemAtPosition(position);
        if (type == null && position != 0) {
            editInteractionListener.addNewType();
            spinner.setSelection(0);
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        Toast.makeText(parent.getContext(),
                "onNothingSelected",
                Toast.LENGTH_SHORT).show();
    }
}