web-dev-qa-db-fra.com

Éliminez les mises en page inutiles pour les activités en plein écran

Comment se débarrasser des dispositions de racine inutiles pour les activités en plein écran?

J'ai une simple activité en plein écran. L'inspecteur de structure affiche une grande hiérarchie de structures racine fournies par Android, dont je n'ai pas besoin en plein écran. 

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

Puis-je me débarrasser d'eux?

  • Si oui, comment? 
  • Si non, pourquoi pas?

La configuration de test

Ouvrez Android Studio. Créez un nouveau projet. Acceptez les paramètres par défaut. Choisissez "Activité vide". Vous obtenez ce manifeste:

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

Vous obtenez ce 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>

Appelez Tools > Android > Layout Inspector pour voir les modèles racine générés. 

Pour le rendre en plein écran, ajoutez simplement un identifiant HelloWorld à TextView dans la présentation et mettez à jour 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
        );
    }
}

Les drapeaux cachent la navigation, mais ils ne suppriment pas les présentations inutilisées.

Ta Réponse

Utilisez un simple TextView. Afficher en plein écran. Vérifiez par Tools > Android > Layout Inspector à quelle distance vous avez supprimé les mises en page racine. Montrer une capture d'écran. Montrez votre code.

22
Blcknx

Vous pouvez vous débarrasser de action_bar_container après avoir changé le thème de votre activité de DarkActionBar à NoActionBar:

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

Ensuite, vous aurez l'arbre suivant:

 enter image description here

Si vous voulez aller encore plus loin et vous débarrasser de ContentFrameLayout, vous pouvez le faire:


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

Ce sera l'arbre de la hiérarchie des vues:

 enter image description here

Vous ne savez pas si vous devez supprimer la vue Android.R.id.content; peut-être que certaines bibliothèques supposent qu'il devrait exister une telle vue.

En ce qui concerne action_mode_bar_stubs: vous ne devez pas vous en préoccuper, dans la mesure où il s'agit de ViewStub s, qui n'affectent pas les performances globales, car ils sont gonflés paresseusement dans la hiérarchie des vues.

8
azizbekian

Oui, vous recherchez probablement ConstraintLayout . C'est semblable à un RelativeLayout, mais avec plus de possibilités et plus facile à utiliser. Comme vous pouvez positionner des vues partout dans la variable ConstraintLayout, vous pouvez vous débarrasser de toutes ces dispositions inutiles et ainsi aplanir la hiérarchie. 

2
Oscar Spruit

 Layout Inspector

Code d'activité 

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

S'il vous plaît ne vous dérange pas l'indentation.

Merci,

2
Rahul Kumar

Oui, vous POUVEZ vous en débarrasser
Il s'agit d'un exemple généré, comme je peux le constater, et comme je le sais, l'activité de base est d'abord générée, puis les paramètres plein écran sont ajoutés. Vous pouvez supprimer tout ce dont vous n’avez pas besoin dans n’importe quel fichier xml. Cependant, vous devriez garder les bases:

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

Il y a mon fichier racine et ça marche:

        <?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>
0
Алексей