来回切换后片段不膨胀菜单

时间:2013-03-31 04:50:32

标签: android menu android-fragments android-actionbar

我对android编程完全陌生,所以我会尽可能准确地解释这个问题。

我有一个由MainActivity组成的应用程序。此活动包含使用ViewPager和FragmentPagerAdapter控制的3个片段。当我最初点击(通过操作栏)或滑动到设置片段时,我的“保存”和“取消”选项会出现在操作栏中。但是,当我从片段滑动(通过滑动),然后向后滑动时,菜单无法加载。无论我移动到不同的片段多少次,无论我如何移动(通过制表符和滑动),菜单都不会返回,直到应用关闭或旋转。

但是,我已经检查了日志并且似乎没有错误抛出,但是当我将Debug输出放入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,然后我也将inflater移动到MainActivity,检查选择了哪个选项卡。这使得菜单绘制速度更快,但似乎是一种非常奇怪的方法。

使用此方法有任何缺点吗?

1 个答案:

答案 0 :(得分:0)

将您的viewpager偏移限制设置为没有标签

像我有3个

viewPager.setOffscreenPageLimit(3);