安卓在Fragment控制状态栏显示隐藏

废话不多上效果

隐藏

显示

核心代码

首先是Framgrent

package com.zx.tab;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

/**
 * 首页Fragment,用于展示和控制状态栏的显示与隐藏。
 */
public class HomeFragment extends Fragment {

    private static final String ARG_PARAM1 = "首页";
    private Button btn_hide_status_bar; // 控制隐藏状态栏的按钮
    private Button btn_show_status_bar; // 控制显示状态栏的按钮
    // 数据传递监听器接口
    public interface OnDataPassListener {
        void onHideStatusBar(String data); // 当隐藏状态栏时被调用
        void onShowStatusBar(String data); // 当显示状态栏时被调用
    }

    // 用于接收Activity传回的监听实例
    private OnDataPassListener mDataPassListener;

    // 创建HomeFragment实例的方法,用于传入参数
    public static HomeFragment newInstance(String param1) {
        HomeFragment fragment = new HomeFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View contentView = inflater.inflate(R.layout.home, container, false);
        btn_hide_status_bar = contentView.findViewById(R.id.btn_hide_status_bar);
        btn_show_status_bar = contentView.findViewById(R.id.btn_show_status_bar);
        // 设置按钮点击事件
        btn_hide_status_bar.setOnClickListener(v -> {
            if (mDataPassListener != null) {
                mDataPassListener.onHideStatusBar("状态栏已隐藏");
            }
        });

        btn_show_status_bar.setOnClickListener(v -> {
            if (mDataPassListener != null) {
                mDataPassListener.onShowStatusBar("状态栏已显示");
            }
        });

        return contentView;
    }
    // 在Fragment与Activity建立关联时设置监听器
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            mDataPassListener = (OnDataPassListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " 必须实现 OnDataPassListener 接口");
        }
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
<!--  隐藏状态栏 显示状态栏-->
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="隐藏状态栏"
    android:id="@+id/btn_hide_status_bar"/>
    <Button
        android:id="@+id/btn_show_status_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示状态栏"/>
</LinearLayout>

布局效果

最后这里是Activity代码

package com.zx.tab;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements HomeFragment.OnDataPassListener{
    private final List<Fragment> fragmentList = new ArrayList<>();
    private final int[] tabIds = {
            R.id.ll_home,
            R.id.ll_mine
    };
    private final int[] iconIds = {
            R.id.im_home,
            R.id.im_mine
    };
    private final int[] textIds = {
            R.id.tv_home,
            R.id.tv_mine
    };
    private ViewPager2 viewPager2=null;
    private ImageView[] tabIcons=null;
    private TextView[] tabTexts=null;
    private ImageView imCurrent=null;
    private TextView tvCurrent=null;
    private LinearLayout ll_tabbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.initializeViews();
        this.initViewPager();
        this.changeTab(0);
    }
    private void initializeViews() {

        this.viewPager2 = findViewById(R.id.viewPager2);
        this.ll_tabbar=findViewById(R.id.ll_tabbar);
        LinearLayout[] tabLayouts = new LinearLayout[2];
        this.tabIcons = new ImageView[2];
        this. tabTexts = new TextView[2];

        for (int i = 0; i < 2; i++) {
            tabLayouts[i] = findViewById(tabIds[i]);
            tabIcons[i] = findViewById(iconIds[i]);
            tabTexts[i] = findViewById(textIds[i]);
            final int index = i;
            tabLayouts[i].setOnClickListener(view -> {
                viewPager2.setCurrentItem(index, false);
                changeTab(index);
            });
        }

    }
    private void initViewPager() {
    this. fragmentList.add(HomeFragment.newInstance(getString(R.string.tv_home)));
        this.fragmentList.add(MeFragment.newInstance(getString(R.string.tv_mine)));
        this.viewPager2.setAdapter(new FragmentAdapter(getSupportFragmentManager(), getLifecycle(), fragmentList));
        this. viewPager2.setUserInputEnabled(false);//是否滑动
        this.viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                changeTab(position);
            }
        });
    }
    private void changeTab(int position) {
        if (imCurrent != null && tvCurrent != null) {
            this.imCurrent.setSelected(false);
            this.tvCurrent.setSelected(false);
        }
        this.imCurrent = tabIcons[position];
        this.tvCurrent = tabTexts[position];
        this.imCurrent.setSelected(true);
        this.tvCurrent.setSelected(true);
    }

    //实现接口 隐藏状态栏
    public void onHideStatusBar(String data) {
        this.ll_tabbar.setVisibility(View.GONE);

        // 隐藏顶部状态栏
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            // 使用WindowInsetsController的动画
            WindowInsetsController insetsController = getWindow().getInsetsController();
            if (insetsController != null) {
                insetsController.hide(WindowInsets.Type.statusBars());
                insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
            }
        } else {
            // 兼容旧版本,使用系统UI标志,并添加淡出动画
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
    }


    // 实现接口 显示状态栏
    public void onShowStatusBar(String data) {
        this.ll_tabbar.setVisibility(View.VISIBLE);

        // 显示顶部状态栏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            WindowInsetsController insetsController = getWindow().getInsetsController();
            if (insetsController != null) {
                insetsController.show(WindowInsets.Type.statusBars());
                insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
            }
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            // 同样,这里可以考虑使用淡入动画来平滑显示状态栏
        }

        if (getSupportActionBar() != null) {
            getSupportActionBar().show();
        }

        // 如果状态栏颜色需要透明处理,可以在显示时设置(这取决于您的UI设计)
        // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        // 或者使用setStatusBarColor设置特定颜色
    }


}

下面是布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <View
        android:layout_width="match_parent"
        android:layout_height="0.1dp"
        android:background="#f0f0f0" />

    <LinearLayout
        android:id="@+id/ll_tabbar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@color/white"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/ll_home"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/im_home"
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:background="@drawable/tab_menu_home" />

            <TextView
                android:id="@+id/tv_home"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tv_home"
                android:textColor="@drawable/tabar_title_text"
                android:textSize="12sp" />
        </LinearLayout>



        <LinearLayout
            android:id="@+id/ll_mine"
            android:layout_width="0dp"
            android:layout_height="56dp"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/im_mine"
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:background="@drawable/tab_menu_mine" />

            <TextView
                android:id="@+id/tv_mine"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tv_mine"
                android:textColor="@drawable/tabar_title_text"
                android:textSize="12sp" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

效果

以上就是 安卓在Fragment控制状态栏显示隐藏的代码,

下面是dome地址

安卓在Fragment控制状态栏显示隐藏资源-CSDN文库

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android中的状态栏显示在设备屏幕顶部的区域,用于显示系统的通知和其他信息。如果想要在Android应用中去掉状态栏,可以通过使用Fragment来实现。 首先,在MainActivity的onCreate方法中,可以通过调用Window类的setFlags方法来隐藏状态栏。代码如下: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 隐藏状态栏 setContentView(R.layout.activity_main); } ``` 接下来,在Fragment的onCreateView方法中,将顶部布局的padding设置为0,以充满整个屏幕。代码如下: ```java @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, container, false); View topLayout = view.findViewById(R.id.top_layout); topLayout.setPadding(0, 0, 0, 0); return view; } ``` 在上述代码中,R.layout.fragment_layout是Fragment的布局文件,需要根据实际情况进行替换。 最后,在AndroidManifest.xml文件中将MainActivity的theme设置为全屏模式。代码如下: ```xml <activity android:name=".MainActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> ... </activity> ``` 通过以上步骤,可以在Android应用中去掉状态栏。但请注意,由于各个手机厂商定制的系统的差异,可能无法在所有设备上完全去掉状态栏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值