在特定的片段中隐藏Android工具栏

64
我有一个问题不知道如何解决。如何在特定的片段中隐藏工具栏,我已经在网上搜索过了,发现通信 Activity 和 Fragment 可以解决它。但对我来说根本不起作用,以下是我的代码:
主活动:
public class MainActivity extends ActionBarActivity implements like_frag.OnHideToolbar{

....

public void onHidingToolbar(int position){
        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        if(toolbar == null){
            getSupportActionBar().hide();
        }else{
            getSupportActionBar().hide();
        }
    }

like_frag.java

public class like_frag extends Fragment {

    OnHideToolbar mCallback;
    Toolbar toolbar;

    public interface OnHideToolbar {
        public void onHidingToolbar(int position);
    }

    public void onAttach(Activity activity){

        try{
            mCallback = (OnHideToolbar) activity;
        }catch(ClassCastException e){
            throw new ClassCastException(activity.toString() + "error implementing");
        }
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.swipefrag, container, false);

        toolbar = (Toolbar)getActivity().findViewById(R.id.toolbar);

        return rootView;
    }

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

提前感谢。

我在工具栏内有一个抽屉。


https://dev59.com/xWEi5IYBdhLWcg3wNqDN - Fahim
OnActivityCreated或onCreateView - Fahim
它不起作用,有其他的想法吗? - smovie9
是的,我调用了 setSupportActionBar(toolbar)。 - smovie9
当我调用setSupportActionBar(toolbar)时,是否存在问题? - smovie9
显示剩余3条评论
10个回答

128
在你想要隐藏工具栏的片段中放置此代码...
 @Override
public void onResume() {
    super.onResume();
    ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
}
@Override
public void onStop() {
    super.onStop();
    ((AppCompatActivity)getActivity()).getSupportActionBar().show();
}

它完美地运行了。我在stackoverflow上尝试了许多答案,但都没有起作用。你救了我的一天。非常感谢。我也同意,这应该是正确的答案。 - Dinith Rukshan Kumara
这太棒了。一直试图从片段上调用 setVisibility(),但是在片段内部使用 .hide().show() 完美运行。 - Mr.Drew
7
使用时要注意闪烁问题!我因为优化约束布局和底部导航栏的性能问题而失眠两天。请注意避免此类问题。 - nandu
@nandu 你是怎么解决的?我现在也遇到了同样的问题,使用约束布局和底部导航时,它会在重置之前被拉伸,看起来很糟糕。 - Big_Chair
2
@Big_Chair 我认为我解决了这个问题,通过将其完全删除,并在需要的地方使用以下代码进行设置: (activity as AppCompatActivity?)?.setSupportActionBar(appbar) - nandu
为了保持一致,我们应该在 onPause() 中显示工具栏吗?或者在 onStart() 中隐藏它? - Erik Medina

44
在片段的 onCreate 方法中调用:
((AppCompatActivity) getActivity()).getSupportActionBar().hide();
AppCompateActivity 替换为您使用的活动类。 编辑: 您可以简单地使用 onResume 方法调用 hide(),并使用 onStop 方法调用 show(),如一些评论中所建议的那样。
@Override
public void onResume() {
    super.onResume();
    ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
}

@Override
public void onStop() {
    super.onStop();
    ((AppCompatActivity)getActivity()).getSupportActionBar().show();
}

9
离开该片段后,工具栏将不再显示。 - Borja
1
你需要展示它:getYourActivity().getSupportActionBar().show(); - ODAXY
1
正如@ODAXY所说,您需要在片段的onDestroy()方法中调用getYourActivity().getSupportActionBar().show();以便恢复应用程序的其余行为。 - Xenon Kfr

28
如果您正在使用新的导航组件,在设置工具栏时请添加此内容。
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
   @Override
   public void onDestinationChanged(@NonNull NavController controller,
           @NonNull NavDestination destination, @Nullable Bundle arguments) {
       if(destination.getId() == R.id.full_screen_destination) {
           toolbar.setVisibility(View.GONE);
           bottomNavigationView.setVisibility(View.GONE);
       } else {
           toolbar.setVisibility(View.VISIBLE);
           bottomNavigationView.setVisibility(View.VISIBLE);
       }
   }
});

对于 Kotlin,您可以执行以下操作:

navController.addOnDestinationChangedListener { _, destination, _ ->
    if(destination.getId() == R.id.full_screen_destination) {
        toolbar.setVisibility(View.GONE)
        bottomNavigationView.setVisibility(View.GONE);
    } else {
        toolbar.setVisibility(View.VISIBLE)
        bottomNavigationView.setVisibility(View.VISIBLE);
    }
}

2
这里是安卓官方文档,解释了addOnDestinationChangedListener - Sanjeev
1
对于初学者来说,值得注意的是,在添加工具栏之前,请确保删除操作栏 - Rubek Joshi
1
嗨。这真的是一个很好的解决方案。因为我需要在某些子片段上隐藏操作栏和底部导航视图。 - Andrea Liureta

9
在Fragment中创建一个接口,并使用它来告诉父Activity隐藏工具栏。
将以下代码添加到您的Fragment中:
private OnEventListener listener;

public interface OnEventListener {

    void hideToolbar() ;
}

public void setOnEventListener(OnEventListener listener) {

    this.listener = listener;
}

在主活动中创建片段后,请添加以下内容:
    myFragment.setOnEventListener(new MyFragment.OnEventListener() {
        @Override
        public void hideToolbar() {

            getSupportActionBar().hide();
        }
    });

每当您需要隐藏工具栏时,请执行以下操作:

listener.hideToolbar();

从你的片段内部进行操作。

在您的帖子中添加一些代码,以提高答案质量。 - Dhia

8

只需要在你想禁用工具栏的片段中添加这些方法,并且在片段的onStop()中将其重新显示。

 @Override
    public void onResume() {
        super.onResume();
        ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
    }

    @Override
    public void onStop() {
        super.onStop();
        ((AppCompatActivity)getActivity()).getSupportActionBar().show();
    }

6

在 Kotlin 中隐藏和显示 supportActionBar 的方式如下:

override fun onResume() {
    super.onResume()
    (activity as AppCompatActivity).supportActionBar?.hide()
}

override fun onStop() {
    super.onStop()
    (activity as AppCompatActivity).supportActionBar?.show()
}

如果您想拥有自己的定制工具栏,可以在 OncreateView 中设置:

//your Custom toolbar in xml
val toolbar = binding.toolbar
(activity as AppCompatActivity).setSupportActionBar(toolbar)

5

只需使用supportActionBar?.hide()supportActionBar?.show()即可。 如果您正在使用NavigationController:

 navController.addOnDestinationChangedListener { controller, destination, arguments ->
        if (destination.id == R.id.loginSuccessFragment) {
            supportActionBar?.hide()
        } else {
            supportActionBar?.show()
        }
    }

请确保在 onPostCreate(savedInstanceState: Bundle?) 中调用此函数,而不是在 onCreateonPostCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) 中调用。 - Victor Ude
这将隐藏操作栏,但当返回到其他屏幕时,布局现在位于操作栏后面,向上移动。 - Gary Frewin

3

将以下代码放入您想要隐藏工具栏的片段中...

在onCreateView或onResume中添加此代码((AppCompatActivity)getActivity()).getSupportActionBar().hide();

并在onDestroy()中执行以下操作

@Override
public void onDestroy() {
super.onDestroy();
((AppCompatActivity)getActivity()).getSupportActionBar().show();}

2

在生命周期方法中使用 getSupportActionBar().hide();getSupportActionBar().show();


getSupportActionBar() 无法从 Fragment 中访问。您需要调用 getActivity() 并进行必要的转换。 - Mihodi Lushan

0

你可以试一下。

 @Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
    if (destination.getId() == R.id.nav_dashboard){
        if (toolbar !=null){
           toolbar.setVisibility(View.GONE);
        }
    }else {
        toolbar.setVisibility(View.VISIBLE);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接