摆脱全屏活动的不必要的根布局

时间:2018-03-01 16:31:24

标签: android android-layout android-activity kotlin android-view

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

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

<code>Tools > Android > Layout Inspector</code>

我可以摆脱它们吗?

  • 如果是,怎么样?
  • 如果不是,为什么不呢?

测试设置

打开Android Studio。创建一个新项目。接受默认设置。选择&#34;清空活动&#34;。你得到这个清单:

<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>

你得到这个layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.blcknx.myapplication.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

调用Tools > Android > Layout Inspector查看生成的根模板。

要将其设为全屏,只需在布局中向TextView添加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
        );
    }
}

标志隐藏了导航,但他们没有删除未使用的布局。

您的回答

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

4 个答案:

答案 0 :(得分:8)

您可以摆脱action_bar_container已将您的活动主题从DarkActionBar更改为NoActionBar

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
</style>

然后你会得到以下树:

enter image description here

如果你想要更多并且摆脱ContentFrameLayout,那么你可以做到这一点:


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val contentView = findViewById(android.R.id.content)
        val parent = contentView.parent as ViewGroup
        parent.removeView(contentView)
        LayoutInflater.from(this).inflate(R.layout.activity_main, parent)
    }

这将是视图层次结构树:

enter image description here

不确定是否应该删除android.R.id.content视图,也许某些库假设应该存在这样的视图。

关于action_mode_bar_stub:您不应该关注它们,只要它们是ViewStub,它们不会影响整体性能,因为它们会被懒惰地膨胀到视图层次结构中。

答案 1 :(得分:2)

是的,您可能正在寻找ConstraintLayout。它类似于RelativeLayout,但具有更多可能性且更易于使用。因为您可以在ConstraintLayout中的任何位置定位视图,所以您可以摆脱所有不必要的布局,从而使层次结构变得平坦。

答案 2 :(得分:2)

Layout Inspector

活动代码

return

R.layout.third_activity

exit

styles.xml

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);
}
}

的AndroidManifest.xml

<?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>

请不要介意缩进。

谢谢,

答案 3 :(得分:0)

是的,你可以摆脱它们
正如我所知,它是生成的样本,据我所知,首先生成基本活动,然后添加全屏设置。您可以删除任何xml文件中不需要的所有内容。虽然,你应该保持基础:

    <?xml version="1.0" encoding="utf-8"?>
<YOUR_ROOT_LAYOUT
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="YOUR.COMPANY.DOMAIN.MainActivity">

    <YOUR_VIEW
        android:id="@+id/SOME_UNIQUE_ID"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</YOUR_ROOT_LAYOUT>

我的根文件有效:

        <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:fitsSystemWindows="true"
        tools:context="tv.kenar.kenarapp.MainActivity">

        <android.support.v4.view.ViewPager
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    </android.support.constraint.ConstraintLayout>