【问题标题】:Android - How to access actionbar's menu items in fragment classAndroid - 如何在片段类中访问操作栏的菜单项
【发布时间】:2017-01-12 01:29:38
【问题描述】:

我应该如何访问片段中操作栏的菜单项? 我试过了,但什么也没发生

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

【问题讨论】:

    标签: android


    【解决方案1】:

    按照以下步骤操作:

    • 在 Fragment 中添加 setHasOptionsMenu(true) 方法。

    • 覆盖 onCreateOptionsMenu(Menu menu, 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;
    }
    

    【讨论】:

    【解决方案2】:

    在您的片段onCreate 方法中添加setHasOptionsMenu(true);

    如果您的片段在 ViewPager 中,那么带有 ViewPager 的片段也需要上述行。

    【讨论】:

      【解决方案3】:

      您不能直接访问 Fragment 中的 ActionBar 菜单项。 你可以做的是把 setHasOptionsMenu(true);在fragment类的onCreateView函数中,这会调用对应activity中的onCreateOptionsMenu(Menu menu)函数。

      在那里,您可以访问操作栏中的所有菜单项。 您可以使用:

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

      【讨论】:

      • 点击片段中的按钮后,我想更改菜单中开关的状态。我该怎么做?
      • 我找到了答案:我们在片段中定义变量,然后在函数 onCreateOptionsMenu 中设置它。所以,我们可以在 onCreateView 中使用它并改变它的状态。
      【解决方案4】:

      我要补充一点(我的声誉不允许我发表评论)以及它对我不起作用的原因。

      确保片段的托管活动扩展 AppCompatActivity 而不是 FragmentActivity

      public class MainActivity extends AppCompatActivity {
      
      }
      

      来自 Google 参考 Documentation 的 FragmentActivity:

      注意:如果您想实现一个包含操作栏的活动,您应该改用 ActionBarActivity 类,它是该类的子类,因此允许您在 API 级别 7 及更高级别使用 Fragment API。

      ActionBarActivity 现已弃用,请改用AppCompatActivity。使用AppCompatActivity 时,还要确保将“活动主题设置为Theme.AppCompat 或类似主题”(Google Doc 也是如此)。

      android.support.v7.app.AppCompatActivityandroid.support.v4.app.FragmentActivity 类的子类(参见AppCompatActivity 参考文档)。

      【讨论】:

        【解决方案5】:

        菜单项 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());
        
                        }
        
                    });
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多