setTitle不会在片段中工作

时间:2016-04-06 19:49:22

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

我有一个片段,我尝试更改操作栏的标题。这一直有效,直到我将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的标题会正确更改。

9 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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


}

答案 2 :(得分:0)

在您要为其设置标题的片段中: 只需致电

  

getActivity()。setTitle(“ Fragment X”);

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

答案 3 :(得分:0)

在片段的onCreate方法而不是onCreateView中设置setHasOptionsMenu并在onCreateView方法中设置标题:-

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

答案 4 :(得分:0)

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

请参考以下代码:

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

答案 5 :(得分:0)

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

getActionBar()。setTitle(“ title”);

答案 6 :(得分:0)

有一个称为MainActivity的活动,其中包含三个片段。

现在,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();
        }
    }

答案 7 :(得分:0)

解决方案很简单,只需转到Res-导航-mobile_navigation ... 在里面,您可以找到以下片段的行:标签,并根据需要设置标题。

答案 8 :(得分:0)

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