android在特定片段中隐藏工具栏

Posted

技术标签:

【中文标题】android在特定片段中隐藏工具栏【英文标题】:android hide toolbar in specific fragment 【发布时间】:2015-05-21 14:20:34 【问题描述】:

我有一个不知道如何解决的问题。你如何在特定片段中隐藏工具栏,我已经在互联网上搜索,我发现是交流活动,片段会解决它。但这对我根本不起作用,这是我的代码:

main_activity:

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

提前致谢。

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

【问题讨论】:

***.com/questions/21504088/… 已经试过了,但还是不行。我必须将它放在片段的 onCreate() 或 onCreateView() 中吗? OnActivityCreated 或 onCreateView 像这样在onCreate()或onCreateView()里面:((ActionBarActivity)getActivity).getSupportActionBar().hide(); 它不起作用,还有其他想法吗? 【参考方案1】:

将此代码放在要隐藏工具栏的片段中...

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

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

【讨论】:

效果很好。我在***中尝试了很多答案。但没有任何效果。你拯救了我的一天。非常感谢。我也同意,这应该是正确的答案。 这太棒了。一直试图从片段中调用setVisibility ().hide().show() 在片段内完美工作。 小心使用时闪烁的问题!我失眠了 2 天,分析我的约束布局和底部导航,检查性能问题。 @nandu 你是怎么解决的?目前在约束布局和底部导航方面面临同样的问题,它在重置之前一直被拉伸,这看起来很可怕。 @Big_Chair 我想我解决了这个问题,方法是完全删除它并在需要的地方使用 (activity as AppCompatActivity?)?.setSupportActionBar(appbar)【参考方案2】:

在片段的onCreate方法调用中:((AppCompatActivity) getActivity()).getSupportActionBar().hide();AppCompateActivity 替换为您使用的活动类。

已编辑

您可以简单地使用onResume 方法调用hide()onStop 方法调用show(),如某些cmets 中所建议的那样。

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


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

【讨论】:

离开该片段时不会再次显示工具栏。 你需要显示它:getYourActivity().getSupportActionBar().show(); 正如@ODAXY 所说,您需要调用 getYourActivity().getSupportActionBar().show();在片段的 onDestroy() 方法上。这样应用程序的其余行为就会回滚。【参考方案3】:

如果您使用的是新的Navigation Component,请在设置工具栏时添加它

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

【讨论】:

这里是android official doc解释addOnDestinationChangedListener 还有一点值得初学者注意,确保你remove the action bar before adding the toolbar 嘿。这确实是一个很好的解决方案。因为我需要在一些子片段上隐藏操作栏和导航视图【参考方案4】:

在fragment中创建一个接口,并用它告诉父activity隐藏工具栏。

将这些行添加到您的片段中:

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();

从你的片段内部。

【讨论】:

在您的帖子中添加一些代码以获得更好的答案质量。【参考方案5】:

只需将这些方法添加到要禁用工具栏的片段中,并在片段的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)

【讨论】:

【参考方案7】:

将此代码放入要隐藏工具栏的片段中...

在 onCreateView 或 onResume 中添加 this(((AppCompatActivity)getActivity()).getSupportActionBar().hide();)。

并在 onDestroy() 中执行此操作

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

【讨论】:

【参考方案8】:

只需使用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?)中调用它 这隐藏了操作栏,但是当返回其他屏幕时,布局现在位于操作栏后面,向上移动。【参考方案9】:

在 lifeCycle 方法中使用 getSupportActionBar().hide();getSupportActionBar().show();

【讨论】:

getSupportActionBar() 无法从 Fragment 访问。如果需要,您需要调用 getActivity() 并进行转换。【参考方案10】:

你可以试试。

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

【讨论】:

以上是关于android在特定片段中隐藏工具栏的主要内容,如果未能解决你的问题,请参考以下文章

Android:向上滚动时显示工具栏(向上拖动),向下滚动时隐藏(向下拖动)

滚动选项卡中的片段时隐藏/显示工具栏

框架布局接管屏幕并隐藏底部导航和工具栏

为特定片段隐藏 ActionBar 的问题

打开键盘隐藏片段下方的工具栏

片段的布局被活动的工具栏/标签布局覆盖