findview extensions android android-layout android-activity kotlin android-view

android - findview - kotlin extensions



Deshágase de los diseños de raíz innecesarios para actividades de pantalla completa (4)

¿Cómo deshacerse de diseños de raíz innecesarios para actividades de pantalla completa?

Tengo una actividad de pantalla completa simple. El inspector de diseño muestra una gran jerarquía de diseños de raíz proporcionados por Android, que no necesito en pantalla completa.

¿Puedo deshacerme de ellos?

  • Si es así, ¿cómo?
  • Si NO, ¿por qué no?

La configuración de prueba

Abra Android Studio. Crea un nuevo proyecto Acepta la configuración predeterminada. Elija "Actividad vacía". Obtienes este manifiesto:

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

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

Llame a Tools > Android > Layout Inspector para ver las plantillas de raíz generadas.

Para hacer que sea de pantalla completa, solo agrega un id HelloWorld al TextView en el diseño y actualiza 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 ); } }

Las banderas ocultan la navegación, pero no eliminan los diseños no utilizados.

Tu respuesta

Use un simple TextView. Mostrarlo a pantalla completa. Seleccione Tools > Android > Layout Inspector hasta qué punto eliminó los diseños de raíz. Muestra una captura de pantalla. Muestra tu código


Puedes deshacerte de action_bar_container habiendo cambiado el tema de tu actividad de DarkActionBar a NoActionBar :

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

Entonces obtendrás el siguiente árbol:

Si quiere ir aún más y deshacerse de ContentFrameLayout , entonces puede hacer esto:

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

Este será el árbol de jerarquía de vista:

No estoy seguro de si debe eliminar la vista android.R.id.content , quizás algunas bibliotecas supongan que debería existir tal vista.

En cuanto a action_mode_bar_stub s: no debería preocuparse por ellos, siempre y cuando sean ViewStub , que no afecten al rendimiento general, porque están inflados de forma perezosa en la jerarquía de vistas.


Sí, probablemente estés buscando ConstraintLayout . Es similar a RelativeLayout , pero con más posibilidades y más fácil de usar. Debido a que puede colocar vistas en todas partes en ConstraintLayout puede deshacerse de todos esos diseños innecesarios, así aplanar la jerarquía.


Código de actividad

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_activity

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

Por favor, no te moleste la sangría.

Gracias,


Sí, puedes librarte de ellos
Se genera una muestra, como puedo ver, y como sé, la actividad básica se genera primero y luego se agregan las configuraciones de pantalla completa. Puede eliminar todo lo que no necesita en ningún archivo xml. Sin embargo, debes mantener lo básico:

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

Hay mi archivo raíz y funciona:

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