【问题标题】:android hide toolbar in specific fragmentandroid在特定片段中隐藏工具栏
【发布时间】: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);
    }
}

提前致谢。

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

【问题讨论】:

  • 已经试过了,但还是不行。我必须将它放在片段的 onCreate() 或 onCreateView() 中吗?
  • OnActivityCreated 或 onCreateView
  • 像这样在onCreate()或onCreateView()里面:((ActionBarActivity)getActivity).getSupportActionBar().hide();
  • 它不起作用,还有其他想法吗?

标签: java android android-fragments toolbar


【解决方案1】:

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

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

【讨论】:

  • 效果很好。我在stackoverflow中尝试了很多答案。但没有任何效果。你拯救了我的一天。非常感谢。我也同意,这应该是正确的答案。
  • 这太棒了。一直试图从片段中调用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);
    }
}

【讨论】:

【解决方案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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-11-20
          • 1970-01-01
          • 2017-06-15
          • 2022-10-17
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多