質問

フラグメントのグループからオプションメニューにアイテムを追加しようとしています。

私は新しいものを作成しました MenuFragment メニュー項目を含めたいフラグメントのクラスとこれを拡張しました。ここにコードは次のとおりです。

public class MenuFragment extends Fragment {

    MenuItem fav;

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

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

何らかの理由で onCreateOptionsMenu 走らないように見えます。

役に立ちましたか?

解決

スーパーメソッドを呼び出します:

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Add your menu entries here
    super.onCreateOptionsMenu(menu, inflater);
}

コードにログステートメントを入れて、メソッドが呼び出されていないかどうか、またはメニューがコードによって修正されていないかどうかを確認します。

また、あなたが電話していることを確認してください setHasOptionsMenu(boolean)onCreate(Bundle) オプションメニューの処理に参加する必要があることをフラグメントに通知するには。

他のヒント

私は同じ問題を抱えていましたが、それを機能させるために最後のステップを要約して紹介する方が良いと思います。

  1. あなたのフラグメントにsethasoptionsmenu(true)メソッドを追加する onCreate(Bundle savedInstanceState) 方法。

  2. オーバーライド onCreateOptionsMenu(Menu menu, MenuInflater inflater) (フラグメントのメニューで何か違うことをしたい場合)と onOptionsItemSelected(MenuItem item) あなたのフラグメントの方法。

  3. あなたの内側 onOptionsItemSelected(MenuItem item) アクティビティの方法、メニュー項目のアクションが実装されたら、falseを返すようにしてください onOptionsItemSelected(MenuItem item) フラグメントの方法。

例:

アクティビティ

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

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

        case R.id.activity_menu_item:

            // Do Activity menu item stuff here
            return true;

        case R.id.fragment_menu_item:

            // Not implemented here
            return false;
        default:
            break;
    }

    return false;
}

断片

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

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

        case R.id.activity_menu_item:

            // Not implemented here
            return false;
        case R.id.fragment_menu_item:

            // Do Fragment menu item stuff here
            return true;

        default:
            break;
    }

    return false;
}

あなたが見つけた場合 onCreateOptionsMenu(Menu menu, MenuInflater inflater) 方法は呼び出されていません。フラグメントから以下に電話してください onCreate(Bundle savedInstanceState) 方法:

setHasOptionsMenu(true)

必要な場合 menu 更新する webview 特定の内部 Fragment, 、使用できます:

断片:

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

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

    // TODO Add your menu entries here
    inflater.inflate(R.menu.menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.exit:
        System.exit(1);
        break;

    case R.id.refresh:
        webView.reload();
        break;
    }
    return true;

}

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/exit" android:title="Exit" android:icon="@drawable/ic_action_cancel" />
    <item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" />
</menu>

の中に menu.xml すべてのメニュー項目を追加する必要があります。次に、最初の読み込みで見たくないアイテムを非表示にすることができます。

menu.xml

<item
    android:id="@+id/action_newItem"
    android:icon="@drawable/action_newItem"
    android:showAsAction="never"
    android:visible="false"
    android:title="@string/action_newItem"/>

追加 setHasOptionsMenu(true) oncreate()メソッドでは、フラグメントクラスにメニュー項目を呼び出します。

fragmentclass.java

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

オーバーライドする必要はありません onCreateOptionsMenu フラグメントクラスで再び。メニュー項目は、オーバーライドして変更(追加/削除)できます onPrepareOptionsMenuフラグメントで利用可能な方法。

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_newItem).setVisible(true);
    super.onPrepareOptionsMenu(menu);

}

tl; dr

使用 android.support.v7.widget.Toolbar そして、ただします:

toolbar.inflateMenu(R.menu.my_menu)
toolbar.setOnMenuItemClickListener {
    onOptionsItemSelected(it)
}

スタンドアロンツールバー

提案されたソリューションのほとんどは次のようです setHasOptionsMenu(true) の場合にのみ機能しています 親のアクティビティには、レイアウトにツールバーがあります そしてそれを宣言します setSupportActionBar(). 。その後、フラグメントはこの正確なメニュー母集団に参加できます ActionBar:

fragment.oncreateoptionsmenu():fragmentホストの標準オプションメニューの内容を初期化します。

特定のフラグメントのスタンドアロンツールバーとメニューが必要な場合 以下を行うことができます。

menu_custom_fragment.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_save"
        android:title="SAVE" />
</menu>

custom_fragment.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    ...

customfragment.kt

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(layout.custom_fragment, container, false)
    val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
    toolbar.inflateMenu(R.menu.menu_custom_fragment)
    toolbar.setOnMenuItemClickListener {
        onOptionsItemSelected(it)
    }
    return view
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.menu_save -> {
            // TODO: User clicked the save button
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

はい、それはとても簡単です。オーバーライドする必要さえありません onCreate() また onCreateOptionsMenu().

PS:これは一緒に機能しています android.support.v4.app.Fragmentandroid.support.v7.widget.Toolbar (必ず使用してください AppCompatActivityAppCompat あなたのテーマ styles.xml).

メニューを膨らませる前に、menu.clear()を使用する必要があります。

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();
        inflater.inflate(R.menu.menu, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

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

私の場合、ここにステップがあります。

ステップ1

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Here notify the fragment that it should participate in options menu handling.
    setHasOptionsMenu(true);
}

ステップ2

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // First clear current all the menu items
    menu.clear();

    // Add the new menu items
    inflater.inflate(R.menu.post_stuff, menu);

    super.onCreateOptionsMenu(menu, inflater);
}

ステップ3

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.post_stuff:
            Log.d(TAG, "Will post the photo to server");
            return true;
        case R.id.cancel_post:
            Log.d(TAG, "Will cancel post the photo");
            return true;
        default:
            break;
    }
    return super.onOptionsItemSelected(item);
}

メニューのカスタムを追加する場合

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_custom, menu);
}

私は同じ問題を抱えていましたが、私の断片はビューページのページでした。それが起こっていた理由は、Instantiating FragmentPagerAdapterの際にアクティビティサポートフラグメントマネージャーではなく、Child Fragment Managerを使用していたからです。

メニューファイル:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/play"
        android:titleCondensed="Speak"
        android:showAsAction="always"
        android:title="Speak"
        android:icon="@drawable/ic_play">
    </item>
    <item
        android:id="@+id/pause"
        android:titleCondensed="Stop"
        android:title="Stop"
        android:showAsAction="always"
        android:icon="@drawable/ic_pause">
    </item>
</menu>

アクティビティコード:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.speak_menu_history, menu);
    return true;
}

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

        case R.id.play:
            Toast.makeText(getApplicationContext(), "speaking....", Toast.LENGTH_LONG).show();
            return false;

        case R.id.pause:
            Toast.makeText(getApplicationContext(), "stopping....", Toast.LENGTH_LONG).show();
            return false;

        default:
            break;
    }

    return false;
}

フラグメントコード:

@Override

public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

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

        case R.id.play:
            text = page.getText().toString();
            speakOut(text);

            // Do Activity menu item stuff here
            return true;

        case R.id.pause:
            speakOf();

            // Not implemented here
            return true;

        default:
            break;
    }
    return false;
}

あなたのコードは大丈夫です。メソッドにはスーパーが欠落していました:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO add your menu : 
    inflater.inflate(R.menu.my_menu, menu);
    //TODO call super
    super.onCreateOptionsMenu(menu, inflater);
}

ここの答えのどれも私のためにうまくいかなかったので、私は夢中になっていました。

メニューを表示するには、電話する必要がありました。 setSupportActionBar(toolbar)

終わり!

注:あなたの場合 toolbar ビューは同じアクティビティレイアウトではありません。アクティビティクラスから上記のコールを直接使用することはできません。この場合、フラグメントクラスからそのアクティビティを取得してから電話をかける必要があります。 setSupportActionBar(toolbar). 。覚えておいてください:アクティビティクラスはAppCompatActivityを拡張する必要があります。

この答えがあなたを助けることを願っています。

フラグメントビューを作成した後にオプションメニューを設定すると、私にとってはうまくいきました。

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

私の問題は少し異なっていました。私はすべてを正しくしました。しかし、私はフラグメントをホストするアクティビティの間違ったクラスを継承していました。

明確にするために、あなたがオーバーライドしている場合 onCreateOptionsMenu(Menu menu, MenuInflater inflater) フラグメントでは、このフラグメントをホストするアクティビティクラスが継承することを確認してください android.support.v7.app.ActionBarActivity (APIレベル11以下でサポートする場合)。

私はを相続していました android.support.v4.app.FragmentActivity 11未満のAPIレベルをサポートするため。

私がこれに追加することの1つと、それが私のために働いていなかった理由。

ナプスターの答えに似ています。

  1. フラグメントのホスティングアクティビティが拡張されていることを確認してください AppCompatActivity, 、 いいえ FragmentActivity!

    public class MainActivity extends AppCompatActivity {
    
    }
    

    Googleリファレンスから ドキュメンテーション fragmentActivityの場合:

    注:アクションバーを含むアクティビティを実装する場合は、代わりにActionBaractivityクラスを使用する必要があります。これは、これのサブクラスであるため、APIレベル7以上でフラグメントAPIを使用できます。

  2. Napsterの答えを更新するために - ActionBarActivity 現在、非推奨、使用してください AppCompatActivity 代わりは。

  3. 使用するとき AppCompatActivity, 、また、「アクティビティテーマ」を設定してくださいTheme.AppCompat または同様のテーマ」(Google Doc)。

ノート: android.support.v7.app.AppCompatActivity のサブクラスです android.support.v4.app.FragmentActivity クラス(参照 AppCompataCivity ref doc)。

メニューフォルダーに.menu XMLファイルを作成し、このXMLを追加します

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/action_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

あなたのフラグメントクラスでは、この方法を超えています

implement SearchView.OnQueryTextListener    in your fragment class



@Override
 public void onViewCreated(View view, Bundle savedInstanceState) {    
  super.onViewCreated(view, savedInstanceState);
  setHasOptionsMenu(true);

}

フラグメントクラスでメニューXMLファイルをセットアップするだけです

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_main, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView)    
    MenuItemCompat.getActionView(item);


    MenuItemCompat.setOnActionExpandListener(item,
            new MenuItemCompat.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionCollapse(MenuItem item) {
                    // Do something when collapsed

                    return true; // Return true to collapse action view
                }

                @Override
                public boolean onMenuItemActionExpand(MenuItem item) {
                    // Do something when expanded
                    return true; // Return true to expand action view
                }
            });

}

上記のすべてが機能しない場合は、デバッグして、oncreateoptionsmenuが呼び出されていることを確認する必要があります(デバッグまたは書き込みログを配置して...)

実行されていない場合、Androidテーマがアクションバーをサポートしていない可能性があります。AndroidManifest.xmlを開き、値を設定します android:theme テーマサポートアクションバー付き:

 <activity
     android:name=".MainActivity"
     android:label="@string/app_name"
     android:theme="@style/Theme.AppCompat">

あなたに OnCreate メソッド追加 sethasoptionmenu()

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

それで オーバーライド 君の OnCreateOptionsmenu

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.add("Menu item")
            .setIcon(android.R.drawable.ic_delete)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top