【问题标题】:invalidateOptionsMenu doesn't work in fragmentinvalidateOptionsMenu 在片段中不起作用
【发布时间】:2014-10-02 15:54:18
【问题描述】:

我想根据编辑文本中的文本是否显示或隐藏操作栏中的项目

所以我做了以下

            public class NounSearch extends  android.app.Fragment 
{

EditText seachEditText;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
            super.onCreate(savedInstanceState);
            View rootView = inflater.inflate(R.layout.nounsearchactivity, container, false);
                    //Intiate EditText
            seachEditText =(EditText) rootView.findViewById(R.id.nounSearch);
            seachEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                        searchResult.Entities = new ArrayList<NounModel>();
                        _currentPage = 0;
                        categoryId = -1;
                        new GetNouns().execute();
                        return true;
                    }


                    return false;
                }
            });
            seachEditText.addTextChangedListener(new TextWatcher() {

               public void afterTextChanged(Editable s) {
               }

               public void beforeTextChanged(CharSequence s, int start,
                 int count, int after) {
               }

               public void onTextChanged(CharSequence s, int start,
                 int before, int count) {
                 getActivity().invalidateOptionsMenu();
               }
              });

    }
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

            if(seachEditText.getText().toString().length() > 0)
            {
                menu.findItem(R.id.action_search).setVisible(true);
            }
            else
            {
                menu.findItem(R.id.action_search).setVisible(false);
            }
    }





}

但actionitem永远不会出现

【问题讨论】:

  • 是执行invalidateOptionsMenu所在的else部分吗?
  • @Rod_Algonquin 我修改了代码,是的,它会触发但从不调用 onCreateOptionsMenu
  • 你能把全班发完吗

标签: android android-fragments android-actionbar


【解决方案1】:

要更新片段内的onCreateOptionsMenu,您需要调用片段的onCreate 方法内的setHasOptionsMenu(true);。否则调用getActivity().invalidateOptionsMenu();时将无法更新

样本:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

编辑:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        if(seachEditText.getText().toString().length() > 0)
        {
            menu.findItem(R.id.action_search).setVisible(true);
        }
        else
        {
            menu.findItem(R.id.action_search).setVisible(false);
        }
    super.onCreateOptionsMenu(menu, inflater);


}

【讨论】:

  • 非常感谢它现在可以正常工作,但该项目似乎不知道如何解决该问题
  • @AMH 尝试将 if 和 else 语句放在 super.onCreateOptionsMenu(menu, inflater); 之前
  • 对不起,请问该怎么做
  • 非常感谢工作正常 :) 它会在其他部分帮助我
  • 菜单选项应该在 onPrepareOptionsMenu 中修改,而不是 onCreateOptionsMenu。
【解决方案2】:

试试这个:

@Override
public boolean onPrepareOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onPrepareOptionsMenu(menu, inflater);
    if (seachEditText.getText().toString().length() > 0) {
        menu.findItem(R.id.action_search).setVisible(true);
    } else {
        menu.findItem(R.id.action_search).setVisible(false);
    }
}

【讨论】:

    【解决方案3】:

    解决方案 1

    这是片段中的工作

     getActivity().invalidateOptionsMenu();
    

    解决方案 2

    如果上面的代码不起作用,试试这个

    invalidateOptionsMenu(getActivity());
    

    导入这个库

    import static androidx.core.app.ActivityCompat.invalidateOptionsMenu;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-03
      • 2020-02-03
      • 2021-01-03
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多