【问题标题】:How to remove action bar from fragment?如何从片段中删除操作栏?
【发布时间】:2016-02-02 20:12:08
【问题描述】:

主要活动:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        getSupportActionBar().setCustomView(R.layout.action_bar_layout);
        getSupportActionBar().setDisplayShowCustomEnabled(true);
        MedSectionFragment medSectionFragment = (MedSectionFragment)getSupportFragmentManager().findFragmentByTag("medSectionFragment");
        if (medSectionFragment == null){
            medSectionFragment = new MedSectionFragment();
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.add(android.R.id.content, medSectionFragment, "medSectionFragment");

            // transaction.addToBackStack(null);
            transaction.commit();
          }
    }

第一个片段:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){
        //Inflate the fragment layout file
        ViewGroup rootView=(ViewGroup)inflater.inflate(R.layout.med_sections_list, container, false);
}

第二个片段:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) {
        //Inflate the fragment layout file
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.official_name_list, container, false);
}

在从一个片段(类别)转换到另一个片段(子类别)之后,我们有了带有操作栏的列表视图。这是真的。

但是当我过渡到第三个片段(详细信息)

public class DetailMedicineFragment extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.detail_medicine_fragment, container, false);
        return rootView;
    }
      @Override
      public void onActivityCreated(Bundle savedInstanceState) {
          super.onActivityCreated(savedInstanceState);
          Toolbar toolbar = (Toolbar)getActivity().findViewById(R.id.mToolbar);
          ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
      }

发生错误

java.lang.IllegalStateException: 这个 Activity 已经有一个动作 酒吧提供的窗户装饰。不要要求 Window.FEATURE_SUPPORT_ACTION_BAR 并将 windowActionBar 设置为 false 您的主题改为使用工具栏。 在 android.support.v7.app.AppCompatDelegateImplV7.setSupportActionBar(AppCompatDelegateImplV7.java:198) 在 android.support.v7.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:99) 在 ua.edu.sumdu.medmaterialdesign.DetailMedicineFragment.onActivityCreated(DetailMedicineFragment.java:41) 在 android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1970) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1092) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 在 android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:211) 在 android.app.ActivityThread.main(ActivityThread.java:5389) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

应用风格

 <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

【问题讨论】:

  • ActionBar 是 Activity 的一部分,Activity 又包含 Fragment。
  • 使用带有 NoActionBar 的主题
  • 如何给片段应用主题?
  • 将其应用于托管片段的活动
  • 如果我将样式应用于活动 从片段中移除操作栏

标签: android android-fragments android-actionbar android-coordinatorlayout


【解决方案1】:

这个 Activity 已经有一个由窗口装饰提供的操作栏。 不要请求 Window.FEATURE_SUPPORT_ACTION_BAR 并设置 windowActionBar 在您的主题中设置为 false 以改用工具栏

既然这个问题已经有了答案(上面的logcats)并且你之前做过,应该用这两个来完成:

<item name="windowActionBar">false</item> 
<item name="windowNoTitle">true</item>

此外,由于您添加了 Toolbar,请确保 ActivityStyles 父级是:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

重点是:NoActionBar。(就像我猜的那样,你使用的是DarkActionBar

还有:Difference and uses of onCreate(), onCreateView() and onActivityCreated() in fragments

onActivityCreated():

顾名思义,这是在ActivityonCreate() 之后调用的 完全的。在onCreateView()之后调用,主要用于 最终初始化(例如,修改 UI 元素)。

听起来不错,但是,在 onCreate 上使用它怎么样?

getActivity().getSupportActionBar().hide()

它应该隐藏ActionBar

但是,关于这一行:

((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);

我认为问题出在AppCompatActivity 中,我猜你在Fragment 中使用它。

见: How to get Toolbar from fragment?

这个答案:https://stackoverflow.com/a/26998718/4409113

类似于它试图从 Activity 投射而不是仅用于 Fragment 的东西。


你说:如何从片段中删除操作栏?

问题是,那你为什么要获取Toolbar

记住,Fragments 没有 Actionbars/ToolbarsActivities 有。

http://developer.android.com/guide/components/fragments.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多