6

私はAndroidの初心者で、小さなAndroidアプリケーションを開発しています。私のアプリケーションでは、Sherlock ライブラリを使用しています。私のアプリケーションには、1 つのメイン アクティビティと 2 つのフラグメントが含まれています。私のリストのフラグメント構造は次のようになります

public class MyCards extends SherlockListFragment
        {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside fragment on create");

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on activity created");
    }

    private void displayCards(int type) {

        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside display cards");

    }

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public void onPause() {
        super.onPause();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.mycards, container, false);

        View view1 = inflater.inflate(R.layout.empty_card, container, false);
        return view;

    }

    /*@Override
    public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    optionsMenu = menu;
    }*/

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_type2, menu);

        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on create option menu");
        Spinner spinner = (Spinner) menu.findItem(R.id.cardType)
                .getActionView();

        SpinnerAdapter adapter = ArrayAdapter.createFromResource(getSherlockActivity().getSupportActionBar().getThemedContext(), R.array.card_action_list,android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter); // set the adapter

        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id) {
                displayCards(pos);
                Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on option selected");
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                displayCards(0);
                Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on no option selection");
            }

        });


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside option select listener");

    }

}

今私の問題は、あるフラグメントから別のフラグメントに初めて切り替えると、次のログ出力が得られることです

01-04 00:54:06.997: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on create option menu
01-04 00:54:06.997: W/KeyCharacterMap(2575): No keyboard for id -1
01-04 00:54:06.997: W/KeyCharacterMap(2575): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
01-04 00:54:07.020: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside fragment on create
01-04 00:54:07.036: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on activity created

つまり、 onfragment create の前に呼び出された create オプションと、アクティビティ create です。また、2つの警告が表示されます。これはエラーなしで機能します。しかし、リストビューを表示できません

同じフラグメントに再度切り替えると(2回目)、次のログ出力が得られます

02-07 10:05:10.983: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on create option menu
02-07 10:05:11.023: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside fragment on create
02-07 10:05:11.043: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on activity created
02-07 10:05:11.113: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside display cards
02-07 10:05:11.133: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on option selected

今回は警告を発せず、適切に動作しています。私のリストビューも表示しています。しかし、初めて正常に動作しません..もう1つのポイントは、Androidの上位バージョンで実行したときに正常に動作することです。しかし、2.3.3 のような下位バージョンの Android で実行した場合、このような動作を示します。onCreate の前に呼び出されるこのListFragment onPrepareOptionsMenu について読みました。修正/バイパスする理由と方法 しかし、私はこの問題を解決できません。

setHasOptionsMenu(true)内部で定義するonActivityCreatedと、次の出力が得られます

01-04 03:32:38.622: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside fragment on create
01-04 03:32:38.653: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on activity created
01-04 03:32:38.692: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on create option menu
01-04 03:32:38.700: W/KeyCharacterMap(8157): No keyboard for id -1
01-04 03:32:38.700: W/KeyCharacterMap(8157): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

また、実際のフラグメントトランザクションが以下のように行われるフラグメントに setHasOptionsMenu を設定しようとしました..

@Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            MyCards mc = new MyCards();
            mc.setHasOptionsMenu(true);
            ft = mActivity.getSupportFragmentManager().beginTransaction();

                mFragment = Fragment.instantiate(mActivity, mClass.getName(),
                        mArgs);

                ft.add(android.R.id.content, mFragment, mTag);
                ft.commit();
            }

それでも同じ問題が発生します。

私のコードや何か他のものに問題はありますか? では、この問題を解決する方法。助けが必要です...ありがとう...

4

2 に答える 2

28

setHasOptionsMenu(true);メソッドを書き込みonActivityCreated(Bundle savedInstanceState)ます。

于 2013-02-08T12:16:15.843 に答える
1

なぜそのように機能するのかわかりませんが、次のようにしsetHasOptionsMenu(true)ます。フラグメントをアクティビティに追加するときに、アクティビティでオプションを設定します。

例えば:

//Activity class
YourListFragment f = new YourListFragment();

f.setHasOptionsMenu(true); //here

getSupportFragmentManager().beginTransaction()
.add(R.id.your_list_fragment_container, f).commit();

そして、フラグメントのコードで設定を削除します。それは私のために働いた。

于 2013-02-07T06:56:54.397 に答える