フラグメントのAndroidオプションメニュー
-
25-10-2019 - |
質問
フラグメントのグループからオプションメニューにアイテムを追加しようとしています。
私は新しいものを作成しました 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)
オプションメニューの処理に参加する必要があることをフラグメントに通知するには。
他のヒント
私は同じ問題を抱えていましたが、それを機能させるために最後のステップを要約して紹介する方が良いと思います。
あなたのフラグメントにsethasoptionsmenu(true)メソッドを追加する
onCreate(Bundle savedInstanceState)
方法。オーバーライド
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(フラグメントのメニューで何か違うことをしたい場合)とonOptionsItemSelected(MenuItem item)
あなたのフラグメントの方法。あなたの内側
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.Fragment
と android.support.v7.widget.Toolbar
(必ず使用してください AppCompatActivity
と AppCompat
あなたのテーマ 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つと、それが私のために働いていなかった理由。
ナプスターの答えに似ています。
フラグメントのホスティングアクティビティが拡張されていることを確認してください
AppCompatActivity
, 、 いいえFragmentActivity
!public class MainActivity extends AppCompatActivity { }
Googleリファレンスから ドキュメンテーション fragmentActivityの場合:
注:アクションバーを含むアクティビティを実装する場合は、代わりにActionBaractivityクラスを使用する必要があります。これは、これのサブクラスであるため、APIレベル7以上でフラグメントAPIを使用できます。
Napsterの答えを更新するために -
ActionBarActivity
現在、非推奨、使用してくださいAppCompatActivity
代わりは。使用するとき
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);
}