我对android编程完全陌生,所以我会尽可能准确地解释这个问题。
我有一个由 MainActivity 组成的应用程序。此活动包含 3 个片段,这些片段使用 ViewPager 和 FragmentPagerAdapter 进行控制。当我最初单击(通过操作栏)或滑动到设置片段时,我的“保存”和“取消”选项出现在操作栏中。但是,当我从片段滑开(通过滑动)然后向后滑时,菜单无法加载。无论我移动到不同的片段多少次,也无论我如何移动(通过选项卡和滑动),在应用程序关闭或旋转之前,菜单都不会返回。
但是,我检查了日志,似乎没有抛出错误,但是当我将调试输出放入 OnCreateOptionsMenu 时,我可以看到它确实被调用了。更奇怪的是,如果我旋转显示器,菜单就会出现,并且 OnCreateOptionsMenu 会被调用几次。我还检查了可见性,它显示项目既可见又启用。就好像该项目正在从屏幕上移开。
SettingsFragment.java
public class SettingsFragment extends Fragment implements TextWatcher {
private EditText txtCost;
private String current = "";
private DatePicker dtDateQuit;
private TimePicker dtTimeQuit;
public SettingsFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_settings, container, false);
NumberPicker np = (NumberPicker) rootView.findViewById(R.id.npCigs);
np.setMaxValue(100);
np.setMinValue(0);
txtCost = (EditText)rootView.findViewById(R.id.txtCost);
txtCost.addTextChangedListener(this);
dtDateQuit = (DatePicker)rootView.findViewById(R.id.dtQuit);
dtTimeQuit = (TimePicker)rootView.findViewById(R.id.tmQuit);
txtCost.setText("$" + String.valueOf(MainActivity.dblCost) + "0");
dtDateQuit.updateDate(MainActivity.dtStopDate.get(Calendar.YEAR),MainActivity.dtStopDate.get(Calendar.MONTH), MainActivity.dtStopDate.get(Calendar.DAY_OF_MONTH));
dtTimeQuit.setCurrentHour(MainActivity.dtStopDate.get(Calendar.HOUR));
dtTimeQuit.setCurrentMinute(MainActivity.dtStopDate.get(Calendar.MINUTE));
np.setValue(MainActivity.intCigDay);
setHasOptionsMenu(true);
return rootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
System.out.println("-------------- Starting Inflation --------------");
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.settings_fragment_menu, menu);
System.out.println("-------------- Inflation Finished --------------");
System.out.println("------------ Menu Item: " + menu.getItem(0).getTitle());
System.out.println("------------ Visible: " +menu.getItem(0).isVisible() );
System.out.println("------------ Enabled: " + menu.getItem(0).isEnabled() );
}
@Override
public void afterTextChanged(Editable s) {
String replaceable = String.format("[%s,.\\s]", NumberFormat.getCurrencyInstance().getCurrency().getSymbol());
if(!s.toString().equals(current)){
txtCost.removeTextChangedListener(this);
String cleanString = s.toString().replaceAll(replaceable, "");
double parsed = Double.parseDouble(cleanString);
String formated = NumberFormat.getCurrencyInstance().format((parsed/100));
current = formated;
txtCost.setText(formated);
txtCost.setSelection(formated.length());
txtCost.addTextChangedListener(this);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
编辑:我似乎偶然发现了一些修复,但它很脏。
在包含片段的 MainActivity 中,在 onTabSelected 中,我调用了 invalidateContextMenu,然后我将充气器也移动到了 MainActivity,检查选择了哪个选项卡。这使得菜单绘制速度更快,但似乎是一种非常奇怪的方式。
使用这种方法有什么缺点吗?