一只刘小彤! 2024-04-11 12:03 采纳率: 0%
浏览 237
已结题

Android 13 taskview 无法切换全屏模式

问题版本:Android 13

问题内容:
activityview是一块虚拟屏可以在两个屏切换activity实现全屏小屏显示,Android13activityview已经无了只有taskview怎么全屏半屏显示 taskview实现原理似乎是直接对窗口进行缩小窗口mode是 MultiWindow,我们怎么才能让activity重新恢复到大屏。。

问题做过的尝试:
先说下尝试了哪些解决方案和一些之前能解决现在废弃的api
ATM 的 setTaskWindowMode废弃
setSystemUiVisibility 废弃
SYSTEM_UI_FLAG_FULLSCREEN 废弃
ActivityOptions::setLaunchWindowingMode 无法实时生效,只有新建Activity才会生效

目前的解决方案:
现在我的解决方案是把当前task进行remove然后重建Activity 但是这样全屏半屏切换会有一次销毁,看看有无有更好方案

  • 写回答

32条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-11 12:03
    关注
    获得2.40元问题酬金

    引自免费微信小程序:皆我百晓生

    针对您提出的关于在Android 13中利用TaskView实现在全屏与半屏之间切换Activity显示的问题,以及如何使Activity从半屏状态恢复至全屏,以下是详细的解决方案:

    TaskView与Activity全/半屏显示原理

    TaskView是Android系统中的一个组件,它允许用户在多个Activity或应用任务间进行快速切换。在Android 13中,虽然ActivityView这一概念可能不再直接存在,但您可以通过系统提供的API和机制实现类似的功能,即对当前Activity窗口进行缩放,以达到全屏或半屏显示的效果。

    要实现这样的功能,主要涉及以下几个关键点:

    1. 调整Activity的窗口大小:通过修改Activity的LayoutParams,可以动态地改变其窗口尺寸,从而实现全屏或半屏显示。

    2. 监听系统手势或自定义操作:为了触发窗口尺寸的变化,您需要监听特定的用户操作,如系统手势(如分屏手势)、自定义按钮点击等。

    3. 适配不同屏幕尺寸:确保您的Activity在全屏和半屏模式下都能正确布局和显示内容。

    下面是一份示例代码,演示了如何通过调整LayoutParams来实现Activity的全屏与半屏切换:

    import android.content.res.Configuration;
    import android.graphics.Rect;
    import android.os.Bundle;
    import android.view.DisplayCutout;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowInsets;
    import android.widget.FrameLayout;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity {
    
        private boolean isFullScreen = true;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 监听自定义按钮点击事件,用于触发全屏/半屏切换
            findViewById(R.id.toggle_fullscreen_button).setOnClickListener(v -> toggleFullScreen());
        }
    
        private void toggleFullScreen() {
            isFullScreen = !isFullScreen;
            updateWindowLayout();
        }
    
        private void updateWindowLayout() {
            Window window = getWindow();
            if (isFullScreen) {
                // 设置为全屏
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
                window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
                window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            } else {
                // 设置为半屏
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
                window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    
                // 调整窗口大小为屏幕宽度的一半
                ViewGroup.LayoutParams layoutParams = window.getDecorView().getLayoutParams();
                if (layoutParams instanceof WindowManager.LayoutParams) {
                    WindowManager.LayoutParams winParams = (WindowManager.LayoutParams) layoutParams;
                    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    
                    int halfScreenWidth = displayMetrics.widthPixels / 2;
                    int halfScreenHeight = displayMetrics.heightPixels / 2;
    
                    // 注意:此处仅作为示例,实际应用中可能需要根据屏幕方向、刘海屏等因素调整窗口位置和大小
                    winParams.width = halfScreenWidth;
                    winParams.height = halfScreenHeight;
                    winParams.x = 0; // 可根据需要调整窗口在X轴上的起始位置
                    winParams.y = 0; // 可根据需要调整窗口在Y轴上的起始位置
    
                    windowManager.updateViewLayout(window.getDecorView(), winParams);
                }
            }
        }
    
        // 可选:处理屏幕旋转时保持全/半屏状态
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            updateWindowLayout();
        }
    }
    

    这份代码中,我们通过监听自定义按钮的点击事件来触发全屏与半屏的切换。在updateWindowLayout()方法中,根据isFullScreen变量的值,分别设置相应的系统UI标志位和窗口参数。对于半屏模式,我们手动调整了窗口的宽度、高度、起始位置等参数,使其占据屏幕一半的区域。请注意,实际应用中可能需要根据屏幕方向、刘海屏等因素进行更细致的布局调整。

    总结

    在Android 13中,虽然ActivityView的概念可能有所变化,但您仍然可以通过调整Activity的窗口参数来实现全屏与半屏的切换。上述示例代码提供了基本的实现思路和方法,您可以根据实际需求进行适当的修改和扩展。如果您需要进一步的帮助,如处理特定的屏幕适配问题或实现特定的用户交互逻辑,请提供更详细的信息,以便我为您提供更针对性的解决方案。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 修改了问题 4月15日
  • 赞助了问题酬金50元 4月15日
  • 修改了问题 4月15日
  • 展开全部

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失