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>