Android - 如何在片段类中访问操作栏的菜单项

时间:2014-07-02 08:51:42

标签: android

我应该如何访问片段中的操作栏菜单项? 我试过这个但没有发生任何事情

@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);
}

5 个答案:

答案 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.AppCompatActivityandroid.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());

                }

            });

    }