2016-11-08 66 views
0

我有一个片段与一个单一的Button。我的目标是每当用户点击该按钮时显示menu_language.xml。我试图找到一个在线答案,这是最接近我可以得到它...但它不工作:如果我按下按钮没有任何反应。这段代码有什么问题?点击后显示菜单按钮:为什么我的代码不工作?

@Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View fgm = inflater.inflate(R.layout.fragment_settings, container, false); 
     Button changeLanguageBtn = (Button) fgm.findViewById(R.id.change_language_button); 
     changeLanguageBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       getActivity().openOptionsMenu(); 
      } 
     }); 
     return fgm; 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, view, menuInfo); 
     if (view.getId() == R.id.change_language_button) { // is this even necessary? 
      MenuInflater inflater = getActivity().getMenuInflater(); 
      inflater.inflate(R.menu.menu_language, menu); 
     } 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_english: 
       // switch to English 
       return true; 
      case R.id.action_italian: 
       // switch to Italian 
       return true; 
      case R.id.action_french: 
       // switch to French 
       return true; 
      default: 
       return super.onContextItemSelected(item); 
     } 
    } 

这是菜单的XML:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

    <group android:checkableBehavior="single"> 
     <item 
      android:id="@+id/action_italian" 
      android:title="@string/italian" /> 
     <item 
      android:id="@+id/action_english" 
      android:title="@string/english" /> 
     <item 
      android:id="@+id/action_french" 
      android:title="@string/french" /> 
    </group> 
</menu> 
+0

你在使用工具栏吗? –

+0

有一个工具栏,但'change_language_button'是**不存在**:它位于屏幕中间。 – Robb1

+0

我想你实现了错误的方法,onCreateOptionsMenu vs onCreateContextMenu –

回答

0

我觉得你有错误的方法(如果你想添加到ActionBar的菜单:如果你读这个方法的Javadoc

public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) 

​​

而:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

说:

/** 
    * Initialize the contents of the Activity's standard options menu. You 
    * should place your menu items in to <var>menu</var>. For this method 
    * to be called, you must have first called {@link #setHasOptionsMenu}. See 
    * {@link Activity#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu} 
    * for more information. 
    * 
    * @param menu The options menu in which you place your items. 
    * 
    * @see #setHasOptionsMenu 
    * @see #onPrepareOptionsMenu 
    * @see #onOptionsItemSelected 
    */ 

所以,如果你想菜单添加到活动中,你必须以后使用。现在,如果您想显示一个上下文菜单锚定到您按下的按钮,然后查看PopupMenu类。

关于你的is this needed?评论,答案是最有可能没有你的情况。

+0

感谢您的回答。我试图按照你的建议使用**选项菜单**,但是我无法使它工作。你介意直接修复我在这种情况下应该使用的代码吗? – Robb1

+0

我有点忙,atm,我没有在一段时间内使用菜单,但从我记得,你会想实现'公共布尔onPrepareOptionsMenu(最终菜单菜单){'当按钮按时,你可以设置一个flag /布尔值来指示是否要显示(或隐藏)菜单。 onPrepareOptionsMenu将决定(因为它正在接收菜单)添加/删除项目到该菜单(如果你愿意,可以从XML膨胀)。试一试,让我们知道它是如何去的。搜索:“在运行时android以编程方式修改菜单”或类似内容,您可能会发现很多样本。祝你好运! –

+0

另外我_think_你需要调用'invalidateOptionsMenu();'所以调用回调(但我不记得atm) –

相关问题