【问题标题】:setTitle doesn't work in fragmentsetTitle 在片段中不起作用
【发布时间】:2016-04-06 19:49:22
【问题描述】:

我有一个片段尝试更改操作栏的标题。这一直有效,直到我将setHasOptionsMenu(true) 添加到片段中。 我该如何解决这个问题?因为我需要片段中的optionsmenu

在片段中

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ((MainActivity)getActivity()).setActionBarTitle(getString(R.string.title_view_tree));
    setHasOptionsMenu(true);
    return inflater.inflate(R.layout.fragment_view_tree, container, false);
}

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

}

在 MainActivity 中:

public void setActionBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

当我使用// 禁用setHasOptionsMenu(true) 时,actionbar 的标题会正确更改。

【问题讨论】:

  • 您是否尝试在操作栏中的标题之前设置 setHasOptionsMenu ?
  • @B378 检查我的答案,我已经测试过了,它可以按您的预期工作。如果您遇到任何问题,请告诉我。

标签: android android-fragments android-actionbar android-titlebar


【解决方案1】:

从 Fragment 的 onCreateOptionMenu 调用 setActionBarTitle。

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_main4, menu);

((MainActivity)getActivity()).setActionBarTitle(getString(R.string.title_view_tree));
        super.onCreateOptionsMenu(menu, inflater);
    }

我建议使用回调接口与活动交互。

【讨论】:

    【解决方案2】:

    执行以下更改以处理片段中的标题和菜单

    public class YourFragment extends Fragment{
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment_xml_contents, container, false);
        ((HostedActivity) getActivity()).setFragmentTitle(getActivity().getString(R.string.frag_title));
        setHasOptionsMenu(true);
        .....
    
        return view;
        }
    
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    
            inflater.inflate(R.menu.profile_menu_xml, menu);
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
    
                case R.id.action_edit:
                    //....... action for menu item
    
                    return false;
    
                default:
                    break;
            }
    
            return false;
        }
    
    
    }
    

    【讨论】:

      【解决方案3】:

      在您要为其设置标题的片段中: 打个电话就行了

      getActivity().setTitle("片段 X");

      @Override
      public void onCreate(Bundle savedInstanceState){
              super.onCreate(savedInstanceState);
              getActivity().setTitle("Fragment X");
      }
      

      【讨论】:

        【解决方案4】:

        在fragment的onCreate方法中设置setHasOptionsMenu而不是onCreateView,在onCreateView方法中设置title:-

            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
                setHasOptionsMenu(true);
                if (getArguments() != null) {
                    mParam1 = getArguments().getString(ARG_PARAM1);
                    mParam2 = getArguments().getString(ARG_PARAM2);
                }
            }
        
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            ((MainActivity)getActivity()).setActionBarTitle(getString(R.string.title_view_tree));
        
            return inflater.inflate(R.layout.fragment_view_tree, container, false);
        }
        

        【讨论】:

          【解决方案5】:

          您可以直接从片段中设置它,而不是从活动中设置标题。

          参考以下代码:

          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                   Bundle savedInstanceState) {
              // Inflate the layout for this fragment
              getActivity().setTitle("Fragment name");
              setHasOptionsMenu(true);
              return inflater.inflate(R.layout.fragment_fragment_example, container, false);
          }
          

          【讨论】:

            【解决方案6】:

            更改操作栏标题,在 Activity 的 onCreate() 中添加以下代码

            getActionBar().setTitle("title");

            【讨论】:

              【解决方案7】:

              有一个名为 MainActivity 的 Activity,它包含三个片段。

              现在,MainActivity 有

              Fragment One
              Fragment Two
              Fragment Three
              

              假设在更改任何片段时,我们要更改操作栏标题。

              这可以通过在包含这些片段的活动中实现 FragmentManager.OnBackStackChangedListener 来完成。

              在重写 onBackStackChanged 方法时,我们可以根据需要轻松更改标题和其他内容。

              @Override
                  public void onBackStackChanged() {
                      try {
                          for (Fragment fragment : getSupportFragmentManager().getFragments()) {
                              if (fragment != null && fragment.isVisible()) {
                                  if (fragment.getTag().equals(AddNewProductSelectAttributeFragment.class.getSimpleName())) {
                                      setTitle(getString(R.string.select_attribute_and_product_type));
                                  } else if (fragment.getTag().equals(AddSimpleProductFragment.class.getSimpleName())) {
                                      setTitle(getString(R.string.add_simple_product));
                                  } else if (fragment.getTag().equals(AddNewProductCategoryFragment.class.getSimpleName())) {
                                      setTitle(getString(R.string.select_categories));
                                  } else if (fragment.getTag().equals(AddCustomOptionFragment.class.getSimpleName())) {
                                      setTitle(getString(R.string.add_custom_options));
                                  }
                              }
                          }
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              

              【讨论】:

                【解决方案8】:

                解决方法很简单,只要去 Res - navigation - mobile_navigation... 在里面你可以找到 line: 你的片段的标签,然后设置你想要的标题。

                【讨论】:

                  【解决方案9】:

                  我在 XML 文件中设置了片段的标签,如下所示:android:label="Title",它使get Activity.setTitle("Title") 代码不起作用,所以当我删除该行时,它会用 java 代码更改标题。

                  【讨论】:

                    猜你喜欢
                    • 2016-04-07
                    • 2015-12-22
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-09-03
                    • 2020-02-03
                    • 2014-10-02
                    相关资源
                    最近更新 更多