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();
}
}
我有一个包含微调器的片段。微调器使用自定义项目,我进行了修改,以便将最后一个项目用作添加新项目按钮。
当您单击新项目按钮时,它会从主 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();
}
}