1

私はAndroidプログラミングにまったく慣れていないので、この問題をできるだけ正確に説明しようとします.

MainActivity で構成されるアプリケーションがあります。このアクティビティには、ViewPager と FragmentPagerAdapter を使用して制御される 3 つのフラグメントが含まれています。最初に (アクション バーから) クリックするか、設定フラグメントにスワイプすると、[保存] と [キャンセル] オプションがアクション バーに表示されます。ただし、(スワイプによって) フラグメントから離れてからスライドして戻ると、メニューの読み込みに失敗します。何度別のフラグメントに移動しても、その方法 (タブとスワイプの両方) に関係なく、アプリを閉じるか回転するまでメニューは戻りません。

ただし、ログを確認したところ、エラーはスローされていないようですが、デバッグ出力を 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 に移動し、どのタブが選択されているかを確認しました。これにより、メニューの描画が大幅に高速化されますが、非常に奇妙な方法のように思えます。

この方法を使用することの欠点はありますか?

4

1 に答える 1

0

ビューページャーのオフセット制限をタブの数に設定し、

私が3を持っていたように

viewPager.setOffscreenPageLimit(3);
于 2013-11-25T13:47:55.153 に答える