我应该如何访问片段中的操作栏菜单项? 我试过这个但没有发生任何事情
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_refresh:
Toast.makeText(getActivity().getApplicationContext(), "clicked", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
}
答案 0 :(得分:58)
请按照以下步骤操作:
在片段中添加setHasOptionsMenu(true)方法。
覆盖onCreateOptionsMenu(菜单菜单,MenuInflater inflater)和 片段中的onOptionsItemSelected(MenuItem item)方法。
在onOptionsItemSelected(MenuItem item)Activity的方法中, 确保在菜单项操作时返回false 在onOptionsItemSelected(MenuItem item)Fragment中实现 方法
示例:
<强>活动强>
@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;
}
答案 1 :(得分:5)
在您的片段onCreate
方法中添加setHasOptionsMenu(true);
。
如果你的片段在ViewPager中,那么带有ViewPager的片段也需要上面一行。
答案 2 :(得分:5)
您无法直接访问片段中的ActionBar菜单项。 你可以做的是把setHasOptionsMenu(true);在片段类中的onCreateView函数中,它调用相应活动中的onCreateOptionsMenu(菜单菜单)函数。
在那里,您可以访问操作栏中的所有菜单项。 您可以使用:
MenuItem item = menu.getItem(index);
你有一个使用它的例子:
片段onCreateView类中的:
setHasOptionsMenu(true);
在相应的活动类中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item = menu.getItem(0);
if(condition)
item.setVisible(true);
else
item.setVisible(false);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_logout:
makeLogout();
return true;
default :
return super.onOptionsItemSelected(item);
}
}
答案 3 :(得分:1)
我要补充一点(我的声誉不允许我发表评论),并说明它不适合我。
确保您的片段的托管活动延伸AppCompatActivity
而不是FragmentActivity
!
public class MainActivity extends AppCompatActivity {
}
从FragmentActivity的Google参考Documentation:
注意:如果要实现包含操作栏的活动,则应该使用ActionBarActivity类,它是此类的子类,因此允许您在API级别7及更高级别上使用Fragment API。
ActionBarActivity
现已弃用,请改用AppCompatActivity
。使用AppCompatActivity
时,还要确保将“活动主题设置为Theme.AppCompat
或类似主题”(Google Doc也是如此)。
android.support.v7.app.AppCompatActivity
是android.support.v4.app.FragmentActivity
类的子类(请参阅AppCompatActivity参考文档)。
答案 4 :(得分:0)
菜单项main.xml文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="dbl.contact.manager.MainActivity" >
<item
android:id="@+id/menu_search"
android:actionLayout="@layout/action_bar"
android:icon="@drawable/searchagain"
android:orderInCategory="0"
android:showAsAction="always"
android:title="search"/>
</menu>
这是菜单项。自定义操作栏,如操作栏中的edittext您必须创建自定义布局。这里自定义action_bar.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<EditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/inputSearch"
android:layout_width="280dp"
android:layout_height="40dp"
android:cursorVisible="true"
android:hint="Search"
android:imeOptions="actionDone"
android:inputType="text"
android:textColor="@android:color/white"
android:textCursorDrawable="@android:color/white" />
然后在片段类中覆盖。只需复制并粘贴此代码即可。
@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);
getActivity().getMenuInflater().inflate(R.menu.main, menu);
View v = (View) menu.findItem(R.id.menu_search).getActionView();
inputSearch = (EditText)v.findViewById(R.id.inputSearch);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
// clientAdapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
// ListData.this.clientAdapter.getFilter().filter(s);
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
adapter.getFilter().filter(s.toString());
}
});
}