在 Fragment 中添加 onOptionsItemSelected 调用
Posted
技术标签:
【中文标题】在 Fragment 中添加 onOptionsItemSelected 调用【英文标题】:Add onOptionsItemSelected calling in Fragment 【发布时间】:2017-01-12 00:14:48 【问题描述】:@Override
public boolean onOptionsItemSelected(MenuItem item)
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in androidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_filter)
FragmentManager fm = getSupportFragmentManager();
if (userType.equals("İş Arayan"))
filterDialogTitle = "İş İlanları Filtre";
else if (userType.equals("Hizmet Arayan"))
filterDialogTitle = "Hizmet İlanları Filtre";
FilterDialogFragment editNameDialogFragment = FilterDialogFragment.newInstance(filterDialogTitle);
editNameDialogFragment.show(fm, "fragment_edit_name");
return true;
return super.onOptionsItemSelected(item);
我在 Fragment 中添加了,但我没有调用,如果我在 MainActivity 中添加,它可以工作,但我想在 Fragment 中调用。我该怎么做?
【问题讨论】:
【参考方案1】:在Fragment中你必须调用setHasOptionsMenu(true)
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
...
那么假设你必须处理menu_item_to_handle_in_fragment
项目点击
对于片段类
@Override
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case R.id.menu_item_to_handle_in_fragment:
// Do onlick on menu action here
return true;
return false;
对于活动类
@Override
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case R.id.menu_item_to_handle_in_fragment:
return false;
return false;
【讨论】:
如果activity和fragment都需要实现怎么办? @AzlanJamal 随意在活动和片段中覆盖此事件setHasOptionsMenu(true)
在 (kotlin) 处理程序 onViewCreated
中也很有效。 +1【参考方案2】:
您需要在片段的 onCreate 中添加 setHasOptionMenu(true)
。
添加此选项时,片段生命周期将调用 onCreateOptionMenu() 和 onOptionItemSelected()。
按照以下步骤操作:
在 Fragment 的 onCreate() 中添加 setHasOptionsMenu(true) 方法。
覆盖 onCreateOptionsMenu(Menu menu, MenuInflater inflater) 和 片段中的 onOptionsItemSelected(MenuItem item) 方法。
在 onOptionsItemSelected(MenuItem item) Activity 的方法中, 确保在菜单项操作为时返回 false 在 onOptionsItemSelected(MenuItem item) Fragment 中实现 方法。
【讨论】:
【参考方案3】:在片段中创建选项菜单的步骤
1.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
inflater.inflate(R.menu.menu_home, menu);
super.onCreateOptionsMenu(menu, inflater);
2。
@Override
public boolean onOptionsItemSelected(MenuItem item)
// Handle item selection
switch (item.getItemId())
case android.R.id.home:
//call function as per your requirement
return true;
default:
return false;
【讨论】:
别忘了加上“setHasOptionsMenu(true);”在 onCreate()【参考方案4】:好的,很多答案,以上都没有显示如何实际调用 Frarment。
这是经过测试和工作的整个示例。
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//activate menu on the top to show icons or menu
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
//this part we need to show back arrow on top so user could use backstack
setupActionBarWithNavController(findNavController(R.id.fragmentContainer))
//setupActionBarWithNavController(findNavController(R.id.fragmentContainer))
override fun onSupportNavigateUp(): Boolean
val navController = findNavController(R.id.fragmentContainer)
return navController.navigateUp() || super.onSupportNavigateUp()
//show icons in top menu
override fun onCreateOptionsMenu(menu: Menu?): Boolean
//inflate our menu our menu situated in res menu menu.xml so R.menu.menu(our menu)
menuInflater.inflate(R.menu.menu, menu)
return true
//if item in menu selected do ......
override fun onOptionsItemSelected(item: MenuItem): Boolean
val navController = findNavController(R.id.fragmentContainer)
when (item.itemId)
**R.id.iconAbout -> navController.navigate(R.id.aboutFragment)**
return super.onOptionsItemSelected(item)
【讨论】:
以上是关于在 Fragment 中添加 onOptionsItemSelected 调用的主要内容,如果未能解决你的问题,请参考以下文章
Fragment中的ViewPager的Fragment添加子Fragment要放在onAttach中添加
在 Fragment 中添加内容之前必须调用 requestFeature()