Android 摆脱不必要的全屏活动根布局 如何消除全屏活动中不必要的根布局?
我有一个简单的全屏活动。LayoutInspector显示了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
- 如果是,如何进行李>
- 若否,原因为何
<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
查看生成的根模板
要使其全屏显示,只需在布局中的文本视图中添加一个idHelloWorld
,然后更新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">