35

私のフラグメントは、親アクティビティ オプションを特定のオプション項目に置き換えますが、項目をクリックすると、onOptionItemSelectedフラグメント内のメソッドをオーバーライドしたにもかかわらず、アクティビティのみが呼び出されます。何か不足していますか?

フラグメントのメソッド:

@Override
public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    Log.d(TAG, "Fragment.onCreateOptionsMenu");

    if (mPasteMode) {
        menu.clear();
        inflater.inflate(R.menu.contexual_paste, menu);
        getActivity().getActionBar().setTitle("PasteMode");
    }
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d(TAG, "Fragment.onOptionsItemSelected");

    switch (item.getItemId()) {
        case R.id.context_action_paste:
            Toast.makeText(getActivity(),
                     "It worked ",
                    Toast.LENGTH_SHORT).show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

アクティビティのメソッド:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d(TAG, "MainActivitiy.onOptionsItemSelected");
    switch (item.getItemId()) {
        case R.id.action_refresh:
            Toast.makeText(this, "Action Refresh selected", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
    return true;
}

Logcat の出力:

MainActivity.onCreateOptionsMenu
Fragment.onCreateOptionsMenu
MainActivitiy.onOptionsItemSelected

onOptionsItemSelectedでは、どうすればフラグメントの を呼び出すことができますか?

4

5 に答える 5

51

アクティビティ メソッドでスーパークラスにチェーンしていません。onCreateOptionsMenu()have returnsuper.onCreateOptionsMenu(menu)と have onOptionsItemSelected()returnをお願いsuper.onOptionsItemSelected(item)します(お取り扱い中のアイテムは除きますtrue

于 2013-08-08T18:33:39.593 に答える
15

私の場合、メニュー項目を追加しませんでした (つまりonCreateOptionsMenu、アクティビティまたはフラグメントを呼び出しませんでした)。ただし、フラグメントでアクション バーのホーム (上) ボタンを使用する必要がありました。このために、これが機能する前setHasOptionsMenu(true)に、フラグメントのonCreateView()メソッドで呼び出されたことを確認する必要がありました。onOptionsItemSelectedその後、アクティビティでオーバーライドは必要ありませんでした。

于 2016-06-21T20:18:02.390 に答える
1

私は解決策を見つけました

Fragment.class

 @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    //MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.wifinity_setting, menu);
    for (int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
        spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0, spanString.length(), 0); //fix the color to white
        item.setTitle(spanString);
    }
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.menu1:
            Intent intent3 = new Intent(context, activity.class);
            startActivity(intent3);
            return true;

    }
    return true;
}

アクティビティ.クラス

onOptionsItemSelected() // Fragmnets onOptionselected メソッドをオーバーライドして呼び出されます .. この解決策は私にとってはうまくいきます

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        default:
            if(fragment != null)
                fragment.onOptionsItemSelected(item);
    }
    return true;
}
于 2019-12-24T04:51:33.020 に答える