Избавиться от ненужных корневых макетов для полноэкранных действий
Как избавиться от ненужных корневых макетов для полноэкранных действий?
У меня простая полноэкранная активность. Инспектор макета показывает большую иерархию корневых макетов, предоставляемых Android, которые мне не нужны в полноэкранном режиме.
Могу ли я избавиться от них?
- Если ДА, как?
- Если НЕТ, почему бы и нет?
Настройка тестирования
Откройте Android Studio. Создайте новый проект. Примите настройки по умолчанию. Выберите "Пустое действие". Вы получаете этот манифест:
<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
чтобы просмотреть созданные корневые шаблоны.
Чтобы сделать его полноэкранным, просто добавьте id HelloWorld
в TextView в макет и обновите 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
как далеко вы удалили корневые макеты. Показать скриншот. Покажите свой код.
Ответы
Ответ 1
Вы можете избавиться от action_bar_container
, изменив тему своей деятельности с DarkActionBar
на NoActionBar
:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
</style>
Затем вы получите следующее дерево:
Если вы хотите пойти еще больше и избавиться от 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)
}
Это будет дерево иерархии представления:
Не уверен, следует ли удалять представление android.R.id.content
, возможно, некоторые библиотеки предполагают, что такой вид должен существовать.
Что касается action_mode_bar_stub
: вы не должны беспокоиться о них, если они являются ViewStub
s, которые не влияют на общую производительность, потому что они лениво раздуты в иерархию представлений.
Ответ 2
Да, вы, вероятно, ищете ConstraintLayout. Он похож на RelativeLayout
, но с большим количеством возможностей и проще в использовании. Поскольку вы можете позиционировать представления повсюду в ConstraintLayout
вы можете избавиться от всех ненужных макетов, тем самым сгладьте иерархию.
Ответ 3
Код активности
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">
Пожалуйста, не обращайте внимания на отступы.
Спасибо,
Ответ 4
Да, вы можете избавиться от них
Он генерирует образец, как я вижу, и, как я знаю, сначала создается основная активность, а затем добавляются полноэкранные настройки. Вы можете удалить все, что вам не нужно в любом 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>
Есть мой файл root, и он работает:
<?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>