Android 摆脱不必要的全屏活动根布局 如何消除全屏活动中不必要的根布局?

Android 摆脱不必要的全屏活动根布局 如何消除全屏活动中不必要的根布局?,android,android-layout,android-activity,kotlin,android-view,Android,Android Layout,Android Activity,Kotlin,Android View,我有一个简单的全屏活动。LayoutInspector显示了Android提供的大量根布局层次结构,我不需要全屏显示 我能摆脱它们吗? 如果是,如何进行 若否,原因为何 测试设置 打开Android Studio。创建一个新项目。接受默认设置。选择“空活动”。您将获得此清单: <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@st

我有一个简单的全屏活动。LayoutInspector显示了Android提供的大量根布局层次结构,我不需要全屏显示

我能摆脱它们吗?
  • 如果是,如何进行
  • 若否,原因为何
测试设置 打开Android Studio。创建一个新项目。接受默认设置。选择“空活动”。您将获得此清单:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
调用
Tools>Android>Layout Inspector
查看生成的根模板

要使其全屏显示,只需在布局中的文本视图中添加一个id
HelloWorld
,然后更新
MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView layout = findViewById(R.id.HelloWorld);
        layout.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LOW_PROFILE
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        );
    }
}
这些标志隐藏了导航,但不会删除未使用的布局

你的回答
使用简单的文本视图。全屏显示。通过
Tools>Android>Layout Inspector
检查删除根布局的距离。显示屏幕截图。显示您的代码。

是的,您可能正在查找。它类似于
RelativeLayout
,但可能性更大,使用更方便。因为您可以将视图放置在
ConstraintLayout
中的任何位置,所以可以消除所有不必要的布局,从而使层次结构平坦化

您可以摆脱将活动主题从
DarkActionBar
更改为
NoActionBar
action bar\u container

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
</style>
这将是视图层次结构树:

不确定是否应该删除
android.R.id.content
视图,可能有些库认为应该存在这样的视图

至于
action\u mode\u bar\u stub
s:你不应该关心它们,只要它们是s,它们不会影响整体性能,因为它们被懒散地膨胀到视图层次结构中。

活动代码

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.Window;
import android.view.WindowManager;

public class ThirdActivity extends Activity {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_third);
}
}
R.layout.third_活动

<?xml version="1.0" encoding="utf-8"?>
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".ThirdActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World"
android:gravity="center">
 </TextView>

styles.xml

<style name="AppTheme2" parent="@android:style/Theme"/>

AndroidManifest.xml

<activity android:name=".ThirdActivity" android:theme="@style/AppTheme2">

请不要介意缩进


谢谢,

您可以使用
约束布局
应用程序使用的基本主题是什么?这不是xml文件。这是一个来自运行中的应用程序的
Tools>Android>LayoutInspector
的屏幕截图。
layout/activity.xml
文件中建议的
ConstraintLayout
从以下所有内容开始。@Blcknx您能提供xml吗,这样我就可以更好地理解布局是如何构成的?同样,这与xml无关。您可以将空的
ConstraintLayout
放入xml中。安卓将把所有这些动作条放在上面。在xml中找不到这一点。您可以在正在运行的应用程序中找到它。对不起,我现在明白了。经过一点搜索,我想这就是安卓系统的工作原理。这些视图可能被系统用来放大应用程序的视图。这是答案的一部分。至少操作栏容器消失了,显然是以一种受支持的方式。删除android.R.id.content是一种攻击,但是它减少了布局检查器中的混乱。它是否也会提高性能,还是会推迟?至于动作模式条存根,它们仍然存在。很可能Android不想让用户失去这个选项。纯粹是猜测。此部分仍然可以找到一个非推测性的答案。
它是否也会提高性能,还是会推迟执行此部分?
视图层次结构中的视图越少,性能越好<代码>至于操作模式栏存根,它们仍然存在。请参阅更新的答案。你说的“投机”是什么意思?是的,我想你可以用类似的方式“砍掉”存根。让我们看看会发生什么。如果没有崩溃,这可能是一个可以接受的答案。Spekulation指的是一个问题,Android官方文档是如何解决这个问题的。他们支持这种黑客行为还是发出警告?
是的,我想你可以用类似的方式“黑客”清除存根。
如果你没有在应用程序中使用操作模式,那么你也可以自由删除这些行为,但只要这些视图不影响性能,你就不会有任何好处。我不认为这种行为有任何记录;DR:不要使用
AppCompatActivity
。从所有答案中,这个答案将布局树减少到最大。我认为,通过将它与azizbekian的解决方案相结合,您甚至可以摆脱
ContentFrameLayout
,这将是最好的答案。由于没有人提供组合,我将选择这个答案作为赢家。对于较老的机器人,不使用
AppCompatActivity
意味着什么,这是一个不同的主题。
<style name="AppTheme2" parent="@android:style/Theme"/>
<activity android:name=".ThirdActivity" android:theme="@style/AppTheme2">